分组依据+左外部加入Sqlite

时间:2016-09-19 05:03:15

标签: sql sqlite

我正在尝试join 2个表格(即使 2nd table没有匹配我希望带来结果)。

所以我认为我可以使用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

如果我按'七月'搜索:

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

提前致谢。任何帮助将不胜感激。

2 个答案:

答案 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