我正在尝试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
提前致谢。任何帮助将不胜感激。
答案 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