我有以下SQL命令,它返回一些值的计数。
SELECT COUNT(*) AS DIALS_CNT,
SUM(CASE WHEN dc.call_result = 'APPT' THEN 1 ELSE 0 END) AS 'APPT_CNT', SUM(CASE WHEN dc.call_result = 'CONV_NO_APPT' THEN 1 ELSE 0 END) AS 'CONVERS_CNT' ,
SUM(CASE WHEN dc.call_result = 'CANNOT_REACH' THEN 1 ELSE 0 END) AS 'CANNOT_REACH_CNT' FROM dialed_calls dc ;
我想将结果按小时分组,以获得此结果
--------------------------------------------------
HOUR | APPT_CNT | CONV_NO_APPT | CANNOT_REACH_CNT
--------------------------------------------------
8:00 | 10 | 20 | 30
--------------------------------------------------
9:00 | 20 | 10 | 10
--------------------------------------------------
等等。获取值大于零的小时值。
表的结构如下:
我想这个组的简单用法并不会很好 溶液。?
非常感谢您的任何建议。
答案 0 :(得分:0)
您可以使用strftime()
提取小时并使用group by
:
SELECT strftime(datetimecolumn, '%H') as hr,
COUNT(*) AS DIALS_CNT,
SUM(CASE WHEN dc.call_result = 'APPT' THEN 1 ELSE 0 END) AS APPT_CNT,
SUM(CASE WHEN dc.call_result = 'CONV_NO_APPT' THEN 1 ELSE 0 END) AS CONVERS_CNT,
SUM(CASE WHEN dc.call_result = 'CANNOT_REACH' THEN 1 ELSE 0 END) AS CANNOT_REACH_CNT
FROM dialed_calls dc
GROUP BY strftime(datetimecolumn, '%H');
建议:不要对列别名使用单引号。仅对字符串和日期常量使用单引号。
答案 1 :(得分:0)
在做了一些研究之后,我发现问题是日期时间值的格式(时区的CET值与sqlite不兼容)。因此,如果我从datetime字符串中删除了CET值,我得到了正确的结果。
SELECT strftime('%H', dc.date) as hr,
COUNT(*) AS DIALS_CNT,
SUM(CASE WHEN dc.call_result = 'APPT' THEN 1 ELSE 0 END) AS APPT_CNT,
SUM(CASE WHEN dc.call_result = 'CONV_NO_APPT' THEN 1 ELSE 0 END) AS CONVERS_CNT,
SUM(CASE WHEN dc.call_result = 'CANNOT_REACH' THEN 1 ELSE 0 END) AS CANNOT_REACH_CNT
FROM dialed_calls dc
GROUP BY strftime('%H', dc.date);