2014-02-26 26 views
0

我在使用SQL查詢時遇到困難。我正在使用sqlite。在sqlite中使用Case語句,麻煩得到我正在尋找的結果

我有一個表expenses。我試圖使用CASE語句來選擇和求和值。下面是一些樣本數據:

enter image description here

這是沒有得到想要什麼,我查詢...

SELECT e.category, 
    CASE 
    WHEN e.schedule ='None' AND e.created_at > '2014-02-01 00:00:00 +0000' THEN SUM(e.amount) 
    WHEN e.schedule = 'Daily' THEN SUM(e.amount)*28.000000 
    WHEN e.schedule = 'Mon - Fri' THEN SUM(e.amount)*20 
    WHEN e.schedule = 'Weekly' THEN SUM(e.amount)*4.000000 
    WHEN e.schedule = 'Every 4 Weeks' THEN SUM(e.amount)*1.083333333333 
    WHEN e.schedule = 'Monthly' THEN SUM(e.amount)*1 
    ELSE 0 
    END 
AS totalValue FROM expenses e GROUP BY e.category ORDER BY e.category 

下面就是查詢返回的照片。

我想什麼的總價值來查看Housing 420,這是因爲有三個記錄與category「住房」,其中一個具有「無」(記錄ID 2)的schedule和創建在一月。另外兩個(記錄10和16)每月有一個schedule。在我CASE我儘量只用created_at比二月的第一個更大的選擇的時間表:

WHEN e.schedule ='None' AND e.created_at > '2014-02-01 00:00:00 +0000' THEN SUM(e.amount) 

或者比「無」以外的時間表值,在這種情況下:

WHEN e.schedule = 'Monthly' THEN SUM(e.amount) 

不幸我得到了495(300 + 120 + 75)的結果。如果它找到符合案例陳述的記錄,則它將所有記錄與特定的category相加!

Sample Output

請你幫我改寫的情況下,使我得到我正在尋找的結果。

回答

4

查詢的一個問題是,您在select列表中使用e.schedule,但它不在group by中。這通常是問題的標誌。

我想你想移動整個case聲明sum()內:

SELECT e.category, 
     SUM(CASE WHEN e.schedule ='None' AND e.created_at > '2014-02-01 00:00:00 +0000' THEN e.amount 
       WHEN e.schedule = 'Daily' THEN e.amount*28.000000 
       WHEN e.schedule = 'Mon - Fri' THEN e.amount*20 
       WHEN e.schedule = 'Weekly' THEN e.amount*4.000000 
       WHEN e.schedule = 'Every 4 Weeks' THEN e.amount*1.083333333333 
       WHEN e.schedule = 'Monthly' THEN e.amount*1 
       ELSE 0 
      END) as totalValue 
FROM expenses e 
GROUP BY e.category 
ORDER BY e.category; 

否則,您可能要移動e.schedulegroup by子句對每個類別中每個計劃單獨一行。

+0

感謝您的回答,我會檢查,看看這是否有所需的結果。謝謝。然而,實際上,我確實在組中有e.category,請參閱上面查詢中的最後一行:'AS totalValue FROM expenses e GROUP BY e.category ORDER BY e.category' – LpLrich

+0

謝謝上班!真是一種解脫,謝謝。 – LpLrich