内部mysql case语句未在结果中显示时不匹配

时间:2015-01-09 10:53:42

标签: mysql sql ruby-on-rails case

我有一个如下的mysql语句

SELECT CASE
       WHEN HOUR(created_at) BETWEEN 0 AND 11 THEN 'Morning'
       WHEN HOUR(created_at) BETWEEN 12 AND 15 THEN 'Afternoon'
       WHEN HOUR(created_at) BETWEEN 16 AND 18 THEN 'Evening'
       WHEN HOUR(created_at) BETWEEN 19 AND 24 THEN 'Night'
   END AS session,
   SUM(total) AS `total` FROM `orders`  WHERE (purchase_date between '2014-05-01' and '2014-05-30')
   GROUP BY CASE
         WHEN HOUR(created_at) BETWEEN 0 AND 11 THEN 1
         WHEN HOUR(created_at) BETWEEN 12 AND 16 THEN 2
         WHEN HOUR(created_at) BETWEEN 17 AND 18 THEN 3
         WHEN HOUR(created_at) BETWEEN 19 AND 24 THEN 4
     END;

我正在获得这样的输出

+------------+------------+
| session    | total      |
+------------+------------+
| Morning    |   47083.21 |
| Afternoon  | 1124804.51 |
| Evening    |  165643.34 |
| Night      | 1690492.01 |
+------------+------------+

但是当早上没有条目然后输出缺少结果中的晨行但是我想要一个早晨但总计为0的行。 请帮我如何实现相同的目标

Expected output

+------------+------------+
| session    | total      |
+------------+------------+
| Morning    |          0 |
| Afternoon  |   14804.51 |
| Evening    |   16643.34 |
| Night      |   19492.01 |
+------------+------------+

实际输出没有早晨行

Actual output

+------------+------------+
| session    | total      |
+------------+------------+
| Afternoon  | 1124804.51 |
| Evening    |  165643.34 |
| Night      | 1690492.01 |
+------------+------------+

如果有任何帮助或暗示来解决这个问题,我将不胜感激

1 个答案:

答案 0 :(得分:0)

添加create table cal (hours int not null)。填写0到23(没有24小时?)。然后做

SELECT CASE
   WHEN cal.hours BETWEEN 0 AND 11 THEN 'Morning'
   WHEN cal.hours BETWEEN 12 AND 15 THEN 'Afternoon'
   WHEN cal.hours BETWEEN 16 AND 18 THEN 'Evening'
   WHEN cal.hours BETWEEN 19 AND 24 THEN 'Night'
END AS session
,sum(coalesce(total, 0)) from
(select  created_at, total from orders 
 where purchase_date between '2014-05-01' and '2014-05-30') T1
 right outer  join cal on (cal.hours = hour(T1.created_at))
group by CASE
   WHEN cal.hours BETWEEN 0 AND 11 THEN 'Morning'
   WHEN cal.hours BETWEEN 12 AND 15 THEN 'Afternoon'
   WHEN cal.hours BETWEEN 16 AND 18 THEN 'Evening'
   WHEN cal.hours BETWEEN 19 AND 24 THEN 'Night' END;