我有以下查询
SELECT
COUNT(c.ID) as RECORD_COUNT, c.WEEK_START, c.LABEL
FROM
(SELECT
a.ID, TRUNC(a.START_DATE,'IW') WEEK_START, 'YES' as LABEL
FROM
TABLE1 a
UNION ALL
SELECT
b.ID, TRUNC(b.START_DATE,'IW') WEEK_START, 'NO' as LABEL
FROM
TABLE1 b
WHERE
FUNCTION(b.ID) = 'Test') AS c
我得到的是每周的记录数,在第一个子查询中带有标签YES
出现的记录数,以及每周的记录数在第二个子查询中带有标签{{ 1}}。
示例:
NO
很多时候,第二个子查询不返回任何记录,因此我缺少某些日期的行。
在上面的示例中,对于RECORD_COUNT WEEK_START LABEL
100 1/28/2019 YES
24 1/28/2019 NO
81 2/4/2019 YES
229 2/11/2019 YES
6 2/11/2019 NO
的{{1}}行未返回任何内容。
如何修改查询以使没有数据的行返回零?
我想看到的是这样的:
NO
答案 0 :(得分:0)
有更复杂的方法可以更普遍地工作。但对于您而言,这是一个简单的方法:
SELECT COUNT(c.ID) as RECORD_COUNT, c.WEEK_START, c.LABEL
FROM
(
SELECT a.ID,
TRUNC(a.START_DATE,'IW') WEEK_START,
'YES' as LABEL
FROM TABLE1 a
UNION ALL
SELECT DECODE(FUNCTION(b.ID),'Test',b.ID,NULL) ID,
TRUNC(b.START_DATE,'IW') WEEK_START,
'NO' as LABEL
FROM TABLE1 b
) as c
答案 1 :(得分:0)
我建议将值放入列而不是行中:
select trunc(t.START_DATE, 'IW') as WEEK_START,
count(*) as num_yes,
sum(case when FUNCTION(b.ID) = 'Test' then 1 else 0 end) as num_nos
from table1
group by trunc(t.START_DATE, 'IW')
order by week_start;
如果您想要单独的行,那么我将取消其显示:
with t as (
select trunc(t.START_DATE, 'IW') as WEEK_START,
count(*) as num_yes,
sum(case when FUNCTION(b.ID) = 'Test' then 1 else 0 end) as num_nos
from table1
group by trunc(t.START_DATE, 'IW')
)
select (case when l.label = 'YES' then t.num_yes else t.num_nos end) as record_count,
t.week_start, l.label
from t cross join
(select 'YES' as label from dual union all select 'NO' as label) l
order by week_start;