嗨我有一个小问题,我查询mysql并检索数据列表到json编码并绘制成图形(例如数量与日期轴)。但是,如果没有数据,sql没有返回查询数据的日期。所以图表上缺少日期。
我在这里读过一些人为了填补空白而创建其他表格的工作。这对我来说不是一个选择。
我有一个解决方案,可以在查询中创建所有日期的数组。
有人可以建议将这种方法压缩到我的多维查询结果数组中。希望通过某种方式聪明的预言。
或者是否有一个我不确定的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;
所以已经非常混乱了。
答案 0 :(得分:0)
您可以使用MySQL中的比较结果是一个数字来简化您的SQL查询; 0表示false,1表示true。所以你可以总结比较来计算你的计数。
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
的时间。所以除了第一秒之外,你不会包括那一天。你可能需要这样做。
关于如何组合事物的实际问题:上述查询按升序生成日期。因此,请记下日期列表,并查看该列表中的第一项是否等于下一条记录的日期。虽然情况并非如此,但在结果数据中插入一行零,并继续列表中的下一个日期,保持查询中的当前记录不变。