Group By +左外部加入Sqlite
问题描述:
我试图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
在此先感谢。任何帮助将不胜感激。
答
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
答
我认为我们能做到这一点,而不使用子查询
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
它的工作。非常感谢 :) –