SQL总和并显示不存在总和值的行

时间:2018-10-16 09:57:15

标签: mysql sql

我有2个表:dt_user和dt_invoice。

**dt_members :**
id firstname
3   Salim
5   Sara
8   Julie

**dt_invoice**

user_id    amount_ht    period month  year 
   3          4950     04 2018  04    2018
   3          7200     10 2018  10    2018
   8         11000     10 2018  10    2018
   8          5500     11 2018  11    2018
   3          6750     11 2018  11    2018
   3          8700     12 2018  12    2018
   3          8800     01 2019  01    2019
   8          7500     01 2019  01    2019
   3          4950     02 2019  02    2019
   3          7550     03 2019  03    2019

我想创建一个连接两个表的查询,但是我想显示表dt_invoice中有 PERIOD 的每个user_id。

**Expected results :**
user_id    amount_ht    period month  year 
   3          4950     04 2018  04    2018
   5            0      04 2018  04    2018  //non-existent record in dt_invoice
   8            0      04 2018  04    2018  //non-existent record in dt_invoice
   3          7200     10 2018  10    2018
   5            0      10 2018  10    2018  //non-existent record in dt_invoice
   8         11000     10 2018  10    2018
   8          5500     11 2018  11    2018
   5            0      11 2018  11    2018  //etc ...
   3          6750     11 2018  11    2018
   3          8700     12 2018  12    2018
   5            0      12 2018  12    2018
   8            0      12 2018  12    2018
   3          8800     01 2019  01    2019
   5            0      01 2019  01    2019
   8          7500     01 2019  01    2019
   3          4950     02 2019  02    2019
   5            0      02 2019  02    2018
   8            0      02 2019  02    2018
   3          7550     03 2019  03    2019
   5            0      03 2019  03    2018
   8            0      03 2019  03    2018

在此先感谢您的帮助,我完全被卡住了..

此处提供SQL数据:https://rextester.com/live/LBSEY76360

也在sqlfiddle中:http://sqlfiddle.com/#!9/728af3/1

2 个答案:

答案 0 :(得分:1)

使用cross join生成行,使用left join引入值:

select m.user_id, p.period, p.month, p.year,
       coalesce(t.amount_ht, 0) as amount_ht
from dt_members m cross join
     (select distinct period, month, year from dt_invoice) p left join
     dt_invoice t
     on t.user_id = m.id and t.period = p.period;

答案 1 :(得分:0)

也许这会有所帮助。

SELECT user_id, amount_ht, period, month, year
FROM dt_invoice 
LEFT JOIN dt_members ON user_id = id