我有两个表,我正在寻找在另一个表中有外键并按日期分组的记录数。 几个月来我们没有记录,但我希望将那些月份的值包含在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') ;
我目前的结果是这样的:
我目前的结果是这样的:
答案 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数据库保留字。带引号的标识符可以是保留字,但不推荐。