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_事实中缺少数据,所以它应该外部连接到个月。修改了答案,现在应该可以了。