在oracle sql中包含未列出的月份

时间:2017-03-05 18:04:02

标签: sql oracle sysdate

我有两个表,我正在寻找在另一个表中有外键并按日期分组的记录数。 几个月来我们没有记录,但我希望将那些月份的值包含在0表示当月没有任何记录。

我的SQL代码是这样的:

SELECT count(*),
       TO_CHAR("TransactionDate",'MONTH')
FROM "Transaction"
WHERE "Type" IN
    (SELECT "TypeID"
     FROM "TYPE_OF_PRODUCT")
GROUP BY TO_CHAR("TransactionDate",'MONTH') ;

我目前的结果是这样的:

enter image description here

我目前的结果是这样的:

enter image description here

1 个答案:

答案 0 :(得分:3)

您可以使用connect by生成所有月份,然后将其与您一起查询:

select c.Mon,
    coalesce(t.cnt, 0) cnt
from (
    select to_char(add_months(sysdate, level), 'MONTH') Mon
    from dual connect by level <= 12
    ) c
left join (
    select count(*) cnt,
        TO_CHAR("TransactionDate", 'MONTH') Mon
    from "Transaction"
    where "Type" in (
            select "TypeID"
            from "TYPE_OF_PRODUCT"
            )
    group by TO_CHAR("TransactionDate", 'MONTH')
    ) t
    on c.Mon = t.Mon;

另外,作为旁注,在标识符中使用"并不是一个好习惯。使用没有双引号的简单标识符。

从官方网站引用 - https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements008.htm

  

非引用标识符不能是Oracle数据库保留字。带引号的标识符可以是保留字,但不推荐