[英]I'm getting unexpected results when I use SUM(CASE WHEN .... THEN "column_name") in sqlite3
我试图找到我在 4 月份收到的订单数量。 我有 3 个订单,但我的查询结果为 0。可能是什么问题?
这是表:
id | first | middle | last | product_name | numberOut | Date
1 | Muhammad | Sameer | Khan | Macbook | 1 | 2020-04-01
2 | Chand | Shah | Khurram | Dell Optiplex | 1 | 2020-04-02
3 | Sultan | | Chohan | HP EliteBook | 1 | 2020-03-31
4 | Express | Eva | Plant | Dell Optiplex | 1 | 2020-03-11
5 | Rana | Faryad | Ali | HP EliteBook | 1 | 2020-04-02
这是查询:
SELECT SUM(CASE WHEN strftime('%m', oDate) = '04' THEN 'id' END) FROM orders;
您的代码的问题是:
THEN 'id'
您正在使用聚合函数SUM()
并对像'id'
这样的字符串文字求和,该字符串被隐式转换为0
(因为它无法转换为数字),因此结果为0
。
即使您删除单引号,您也不会得到您想要的结果,因为您将得到id
的总和。
但如果你使用:
THEN 1 ELSE 0
那么你会得到正确的结果。
但是使用 SQLite 你可以写得更简单:
SELECT SUM(strftime('%m', oDate) = '04') FROM orders;
没有CASE
表达式。
或者因为您只想计算订单,然后COUNT()
会这样做:
SELECT COUNT(*) FROM orders WHERE strftime('%m', oDate) = '04';
编辑。
如果要计算所有月份的订单,请按月分组:
SELECT strftime('%Y-%m', oDate) AS month,
COUNT(*) AS number_of_orders
FROM orders
GROUP BY month;
如果你想要所有的四月,那么你可以只看月份。 我会推荐:
select count(*)
from orders o
where o.date >= '2020-04-01' and o.date < '2020-05-01';
请注意,这会直接将date
与where
子句中的有效日期进行比较。
您的查询有问题。 您不需要执行该聚合操作。
SELECT COUNT(*) from table_name WHERE strftime('%m', Date) = '04';
SELECT SUM(CASE WHEN strftime('%m', oDate) = '04' THEN 1 ELSE 0 END) FROM orders;
如果您需要使用 SUM
我将使用显式日期比较而不是日期函数 - 这使得查询 SARGeable,即它可能有益于现有索引。
最有效的方法,在where
子句中使用过滤器:
select count(*) cnt
from orders
where oDate >= '2020-04-01' and oDate < '2020-05-01'
或者,如果即使 4 月份没有订单,您也希望结果为0
,您可以按照您最初的意图进行条件聚合:
select sum(case when oDate >= '2020-04-01' and oDate < '2020-05-01' then 1 else 0 end) cnt
from orders
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.