簡體   English   中英

當我在 sqlite3 中使用 SUM(CASE WHEN .... THEN "column_name") 時,我得到了意想不到的結果

[英]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';

請注意,這會直接將datewhere子句中的有效日期進行比較。

您的查詢有問題。 您不需要執行該聚合操作。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM