2016-09-19 73 views
2

我試圖join 2表(即使沒有匹配第二table我想要帶來的結果)。Group By +左外部加入Sqlite

所以我認爲我可以解決問題使用LEFT OUTER JOIN,但出於某種原因,我無法做到這一點。

這裏的模式:

entry_types

ID   NAME 
---------- ---------- 
1   entry_type1 
2   entry_type2 

entries

ID   VALUE  ENTRY_TYPE_ID   DATE  
---------- ---------- --------------   ---------- 
1   55.5  1      2016-09-18T17:46:27.398Z 
2   84.21  2      2016-09-18T18:41:54.142Z 
3   144.5  2      2016-09-19T01:13:51.099Z 
4   150.7  1      2016-07-17T19:28:12.026Z 

展望模式上面的我們可以暗示我在9月份有entry_types的發生,但是在7月份我只有一個entry_type

那麼,我想要什麼?

  • 我想要檢索總是兩個entry_types,並且,當然,設置0到不存在的entry_type(如果有一個)。

query我試圖如下:

SELECT et.name as entry_type, 
     SUM(CASE WHEN en.value IS NULL THEN 0 ELSE en.value END) as total 
FROM entries en 
LEFT OUTER JOIN entry_types et 
ON en.entry_type_id = et.id 
WHERE STRFTIME('%m', en.date) = 'SOME MONTH' 
GROUP BY en.entry_type_id 

預期的結果

如果我通過搜索 '九':

NAME   TOTAL 
----------  ---------- 
entry_type1  55.5 
entry_type2  228.71 

如果我按'July'搜索:

NAME   TOTAL 
----------  ---------- 
entry_type1  150.7 
entry_type2  0 

在此先感謝。任何幫助將不勝感激。

回答

1
SELECT t1.name, 
     COALESCE(t2.value, 0) 
FROM entry_types t1 
LEFT JOIN 
(
    SELECT entry_type_id, SUM(value) AS value 
    FROM entries 
    WHERE STRFTIME('%m', date) = 'SOME MONTH' 
    GROUP BY entry_type_id 
) t2 
    ON t1.id = t2.entry_type_id 
+1

它的工作。非常感謝 :) –

1

我認爲我們能做到這一點,而不使用子查詢

SELECT et.id,et.name AS entry_type, 
    CASE WHEN IFNULL(SUM(en.value), '') = '' THEN 0 ELSE SUM(en.value) AS total 
FROM entry_types et 
LEFT JOIN entries en ON en.entry_type_id = et.id 
    AND STRFTIME('%m', en.date) = 'SOME MONTH' 
GROUP BY et.id,et.name