Sql 对于没有数据的日期/月份,返回0(而不是省略该行)
请在下面找到我的问题Sql 对于没有数据的日期/月份,返回0(而不是省略该行),sql,oracle,Sql,Oracle,请在下面找到我的问题 select concat(g.display_country_cd,to_char(cli.business_date,'YYYYMM')) year ,round(cli.amount/1000000) amount from cli_fact cli join geography g on cli.geo_skey=g.geo_skey where cli.region='ASIA' and to_char(cli.business_date,'MMYYYY')
select concat(g.display_country_cd,to_char(cli.business_date,'YYYYMM')) year
,round(cli.amount/1000000) amount
from cli_fact cli join geography g on cli.geo_skey=g.geo_skey
where cli.region='ASIA'
and to_char(cli.business_date,'MMYYYY') between '01'||'2013' and '06'||'2013'
如果使用coalesce或任何其他方式没有任何特定月份的记录,如何显示特定月份的0
提前感谢将您的加入更改为左加入。尝试一下,如果出现任何错误,请告诉我,代码未经测试,但应该可以工作-
with months(mon) as (
select add_months(to_date( '01'||'2013', 'MMYYYY'), level - 1)
from dual
connect by add_months(to_date( '01'||'2013', 'MMYYYY'), level - 1) <= to_date( '06'||'2013', 'MMYYYY'))
select concat(g.display_country_cd,to_char(m.mon,'YYYYMM')) year,
round((coalesce(cli.amount, 0))/1000000) amount
from months m
left outer join cli_fact cli
on to_char(m.mon,'MMYYYY') = to_char(cli.business_date,'MMYYYY')
left outer join geography g
on cli.geo_skey=g.geo_skey;
尝试下面的查询,让我知道它是否解决了您的问题
WITH MONTHS AS
(
SELECT TO_CHAR( ADD_MONTHS(TO_DATE( '01'||'2013', 'MMYYYY'), LEVEL - 1),'MMYYYY') MON
FROM DUAL
CONNECT BY ADD_MONTHS(TO_DATE( '01'||'2013', 'MMYYYY'), LEVEL - 1) <= TO_DATE( '06'||'2013', 'MMYYYY')
)
SELECT
CONCAT(G.DISPLAY_COUNTRY_CD,TO_CHAR(CLI.BUSINESS_DATE,'YYYYMM')) YEAR,
ROUND((COALESCE(CLI.AMOUNT, 0))/1000000) AMOUNT
FROM CLI_FACT CLI, GEOGRAPHY G , MONTHS M
WHERE CLI.GEO_SKEY = G.GEO_SKEY
AND M.MON = TO_CHAR(CLI.BUSINESS_DATE,'MMYYYY') (+)
AND CLI.REGION='ASIA';
对可能从函数派生的月份表进行联接,以合成缺少的行。Coalesce只能在一行内使用,但不能添加新行。日期表比月份表更有用。@DanBracuk True,我只是抛出了这个概念,不是好的开始,而是不完整的。您好,对于有记录的月份,此查询工作正常,但如果没有记录,则仍将不返回任何记录,而不是0。。这是一个错误,我将基表作为cli_事实,但它应该是个月,因为cli_事实中缺少数据,所以它应该外部连接到个月。修改了答案,现在应该可以了。