[英]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.