【发布时间】:2020-05-25 12:27:46
【问题描述】:
以下查询返回每月的交易数量。 我希望查询在 TV_TRANSACTION 表中没有交易(无记录)的月份返回 0。
WITH
msc (num) AS
(VALUES (TIMESTAMP('2019-10-01 00:00:00.001'))
UNION ALL
SELECT num + 1 MONTH
FROM msc
WHERE num < current timestamp - 1 MONTH
)
SELECT SUBSTR(CHAR(num),1,7),
count(case when t.STATUS = 44 and t.TRANSACTION_TYPE = 0 then 1 else 0 end) FROM TV_TRANSACTION t
join TB_INSTALLATION i on t.INSTALLATION_ID = i.INSTALLATION_ID
right join msc mc on SUBSTR(CHAR(t.REGISTRATION_DATE),1,7) = SUBSTR(CHAR(mc.num),1,7)
where i.IB24_VERSION = 2
and date(t.REGISTRATION_DATE) >= '2019-10-01'
and t.STATUS = 44
and t.TRANSACTION_TYPE = 0
and SUBSTR(CHAR(t.REGISTRATION_DATE),1,7) >= SUBSTR(CHAR(i.IB24_VERSION_UPDATE_DATE),1,7)
group by SUBSTR(CHAR(mc.num),1,7)
此时查询返回结果
2020-02 | 1552
2020-03 | 6981
2020-04 | 16439
2020-05 | 5
如何修改查询以获得这样的结果?:
2019-10 | 0
2019-11 | 0
2019-12 | 0
2020-01 | 0
2020-02 | 1552
2020-03 | 6981
2020-04 | 16439
2020-05 | 5
【问题讨论】:
-
您需要以某种方式从月份列表开始;也许来自日历表。
-
RIGHT JOIN会自动转换为INNER JOIN,因为您的WHERE子句包含左表中的列。这就是问题所在。解决方案:将WHERE改为AND。 -
@GordonLinoff, msc 表返回月份列表
-
你把
WHERE改成AND了吗?
标签: sql date join db2 recursive-query