2017-09-26 40 views
0

我正在嘗試編寫一個SQLite查詢,該查詢獲取一個值的總次數除以月份。SQLite將多個查詢與共享列組合在一起

所需的輸出的一個例子:

Name Jun Jul Aug Sept 
John 3 2 5 2 
Robert 4 12 45 22 
Linda 0 2 1 0 

我想Name場只返回獨特的結果,所以它基本上會計算每一次「約翰」出現在六月,七月等月份

這是我到目前爲止,使用我的實際數據庫。它的工作原理是返回右列和唯一的「ReasonDetail」,但計數不準確:

SELECT * FROM 

(
    SELECT ReasonDetail AS Appetite, COUNT(*) AS June 
     FROM CallRecords 
     WHERE CallReason = 'Appetite Question' 
     AND DateTime BETWEEN '2017-06-01 00:00' AND '2017-07-01 00:00' 
     GROUP BY ReasonDetail 
), 
(
    SELECT COUNT(*) AS July 
     FROM CallRecords 
     WHERE CallReason = 'Appetite Question' 
     AND DateTime BETWEEN '2017-07-01 00:00' AND '2017-08-01 00:00' 
     GROUP BY ReasonDetail 
), 
(
    SELECT COUNT(*) AS August 
     FROM CallRecords 
     WHERE CallReason = 'Appetite Question' 
     AND DateTime BETWEEN '2017-08-01 00:00' AND '2017-09-01 00:00' 
     GROUP BY ReasonDetail 
) 
GROUP BY Appetite 

我在做什麼錯在這裏?在這種情況下有沒有更好的方法來編譯正確的計數?

謝謝!

回答

0

這被稱爲條件聚合。在集合函數中使用case表達式。

SELECT ReasonDetail AS Appetite 
,COUNT(CASE WHEN DateTime>='2017-06-01 00:00' AND DateTime<'2017-07-01 00:00' THEN 1 END) AS June 
,COUNT(CASE WHEN DateTime>='2017-07-01 00:00' AND DateTime<'2017-08-01 00:00' THEN 1 END) AS July 
,COUNT(CASE WHEN DateTime>='2017-08-01 00:00' AND DateTime<'2017-09-01 00:00' THEN 1 END) AS August 
FROM CallRecords 
WHERE CallReason = 'Appetite Question' 
GROUP BY ReasonDetail 
+0

這是非常好的和完美的工作。但是,您錯過了DateTime參數之間的「AND」子句。如果你更新你的答案,我會選擇它。 – Zephyr

+0

當然..我錯過了。現在更新了答案。 –