【问题标题】:not matching when inside mysql case statement is not showing in result当内部 mysql case 语句未显示在结果中时不匹配
【发布时间】:2015-01-09 10:53:41
【问题描述】:

我有一个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 |
+------------+------------+

但是当早上没有条目时,输出会在结果中缺少 Morning 行,但我想要一个包含早晨但总计为 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 |
+------------+------------+

如果能提供任何帮助或提示来解决此问题,我将不胜感激

【问题讨论】:

  • 您只需要来自该查询本身吗?
  • 不一定是同一个查询,但如果有其他替代查询也可以
  • 我不想使用带有该查询的备用查询,我只想使用带有条件的 o/p...如果 total=0 跳过该记录可以吗?
  • 如果总计为零,则应反映该结果

标签: mysql sql ruby-on-rails case


【解决方案1】:

添加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;

【讨论】:

  • 嗨@dan b...此查询未按预期工作。它仍然缺少早晨行,因为订单表中没有早晨的数据。即使在与 cal 表的左外连接之后。
  • @Peru 你现在可以试试吗
  • @Peru 再次修复。将左外连接更改为右外连接并使用合并
  • ........还是一样的结果。输出中仍然缺少早晨行。不知道为什么
  • 其实左外连接、右外连接、内连接和普通连接也不行
猜你喜欢
  • 2014-11-13
  • 2021-04-01
  • 2021-02-09
  • 2014-02-09
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
相关资源
最近更新 更多