0

您好我有一个小问题,我查询 mysql 并检索数据列表以进行 json 编码并绘制成图表(例如数量与日期轴)。但是 sql 正确地不返回没有数据的查询数据的日期。所以图表上缺少日期。

我在这里读到了一些人拒绝创建其他表格的工作只是为了填补空白。这不是我的选择。

我有一个解决方案,可以在查询中创建一个包含所有日期的数组。

有人可以建议一种将其压缩到我的多维查询结果数组的方法。希望通过某种聪明的 foreach 方式。

或者是否有一个我不确定的 SQL 函数可以填写空白日期?

我的查询目前看起来像:

    SELECT SQL_CALC_FOUND_ROWS Date, SUM(call_answer) AS call_answer, SUM(call_busy) AS call_busy, SUM(call_noanswer) AS call_noanswer, SUM(call_notrec) as call_notrec
    FROM ( 
        SELECT * FROM ( 
            SELECT substring(dateCreated, 1,10) AS Date, COUNT(id) as call_answer, 0 as call_busy, 0 as call_noanswer, 0 as call_notrec
            FROM cdr 
            WHERE  (company = '8346767432431') AND (dateCreated >= '2012-10-16' ) AND (dateCreated <= '2012-11-16' )  AND dialStatus = 'NORMAL_CLEARING' GROUP BY Date ) 
            AS t_0 
            UNION
            SELECT * FROM ( 
            SELECT substring(dateCreated, 1,10) AS Date, 0 as call_answer, COUNT(id) as call_busy, 0 as call_noanswer, 0 as call_notrec
            FROM cdr 
            WHERE  (company = '8346767432431') AND (dateCreated >= '2012-10-16' ) AND (dateCreated <= '2012-11-16' )  AND dialStatus = 'USER_BUSY' GROUP BY Date )
            AS t_1
            UNION
            SELECT * FROM ( 
            SELECT substring(dateCreated, 1,10) AS Date, 0 as call_answer, 0 as call_busy, COUNT(id) as call_noanswer, 0 as call_notrec
            FROM cdr 
            WHERE  (company = '8346767432431') AND (dateCreated >= '2012-10-16' ) AND (dateCreated <= '2012-11-16' )  AND (dialStatus = 'ORIGINATOR_CANCEL' OR dialStatus = 'NO_USER_RESPONSE') GROUP BY Date )
            AS t_2
            UNION
            SELECT * FROM ( 
            SELECT substring(dateCreated, 1,10) AS Date, 0 as call_answer, 0 as call_busy, 0 as call_noanswer, COUNT(id) as call_notrec
            FROM cdr 
            WHERE  (company = '8346767432431') AND (dateCreated >= '2012-10-16' ) AND (dateCreated <= '2012-11-16' )  AND (dialStatus = 'UNALLOCATED_NUMBER' OR dialStatus = 'INVALID_NUMBER_FORMAT') GROUP BY Date )
            AS t_3

    )

    AS t_total
    GROUP BY Date;

所以已经很乱了。

4

1 回答 1

0

您可以使用 MySQL 中的比较结果是一个数字这一事实来简化您的 SQL 查询;0 为假,1 为真。所以你可以总结比较来计算你的计数。

SELECT DATE(dateCreated) AS `Date`,
 SUM(dialStatus = 'NORMAL_CLEARING') AS call_answer,
 SUM(dialStatus = 'USER_BUSY') AS call_busy,
 SUM(dialStatus = 'ORIGINATOR_CANCEL') AS call_noanswer,
 SUM(dialStatus = 'UNALLOCATED_NUMBER') AS call_notrec
FROM cdr 
WHERE company = '8346767432431'
  AND dateCreated BETWEEN '2012-10-16' AND '2012-11-16' -- = 11-16 0:00 !
GROUP BY DATE(dateCreated) ASC

请注意,无论是在此查询中还是在原始查询中,范围的结尾都将隐含地假定时间0:00. 所以你不会包括那一天,除了第一秒。你可能需要调整它。

至于如何组合事物的实际问题:上述查询按升序生成日期。所以拿你的日期列表,看看该列表上的第一项是否等于下一条记录的日期。虽然情况并非如此,但在结果数据中插入一行零并继续列表中的下一个日期,保持查询中的当前记录不变。

于 2012-11-16T12:08:37.317 回答