SQL 使用 group by rollup 子句和格式进行查询
SQL query with group by rollup clause and formats
我的SQL查询和输出如下:
Select
c.caseName, ci.caseBy, lk.desc, c.prepared
from
cases c
left outer join
case_info ci on c.tin = ci.tin
left outer join
lk_zone lk on lk.id = c.id
where
c.delete_dt is not null;
输出:
caseName caseBy zone Prepared
------------------------------------
ABC 10 Above N
BCD 11 Above Y
ABC 10 In N
BCD 11 Below N
CEF 12 Above Y
CEF 12 In N
CEF 12 Below N
BCD 11 In Y
CEF 13 Above N
CEF 13 In Y
CEF 13 Below N
预期输出:
CaseName aseBy zone Cases Prepped %Comp
-------------------------------------------------------
ABC 10 Above 1 0 0%
ABC 10 In 1 0 0%
ABC 10 Below
BCD 11 Above 1 1 100%
BCD 11 In 1 1 100%
BCD 11 Below 1 0 0%
CEF 12 Above 1 1 100%
CEF 12 In 1 0 0%
CEF 12 Below 1 0 0%
CEF 13 Above 1 0 0%
CEF 13 In 1 1 100%
CEF 13 Below 1 0 0%
Total 11 4 36.36%
为此,我将查询更改如下:
Select
c.caseName, ci.caseBy, lk.desc Zone,
sum(nvl2(PREPARED, 1, 0)) as cases,
sum(decode(PREPARED, 'Y', 1, 0)) as prepped,
round(avg(CASE WHEN PREPARED = 'Y' THEN 100 ELSE 0 END), 2)||'%' as comp
from
cases c
left outer join
case_info ci on c.tin = ci.tin
left outer join
lk_zone lk on lk.id = c.id
where
c.delete_dt is not null
group by
rollup(caseName, caseBy, lk.descr);
对于 caseName、CaseBy 的所有组合,这并未返回上述 In
和 Below
的预期结果。例如 caseName ABC 和 caseBy 10 没有 Below 记录。在那种情况下,我应该让该行显示为 0 或空值。我也想要定义的总数。
感谢任何帮助。谢谢。
您希望 cross join
生成行,然后 left join
引入数据。您不清楚数据是什么样的,所以我最好的猜测是:
select c.caseName, ci.caseBy, lk.desc, c.prepared
from cases c cross join
lk_zone lk left join
case_info ci
on c.tin = ci.tin and
lk.id = c.id
where c.delete_dt is not null;
然后您可以针对其他列和行修改它。
我的SQL查询和输出如下:
Select
c.caseName, ci.caseBy, lk.desc, c.prepared
from
cases c
left outer join
case_info ci on c.tin = ci.tin
left outer join
lk_zone lk on lk.id = c.id
where
c.delete_dt is not null;
输出:
caseName caseBy zone Prepared
------------------------------------
ABC 10 Above N
BCD 11 Above Y
ABC 10 In N
BCD 11 Below N
CEF 12 Above Y
CEF 12 In N
CEF 12 Below N
BCD 11 In Y
CEF 13 Above N
CEF 13 In Y
CEF 13 Below N
预期输出:
CaseName aseBy zone Cases Prepped %Comp
-------------------------------------------------------
ABC 10 Above 1 0 0%
ABC 10 In 1 0 0%
ABC 10 Below
BCD 11 Above 1 1 100%
BCD 11 In 1 1 100%
BCD 11 Below 1 0 0%
CEF 12 Above 1 1 100%
CEF 12 In 1 0 0%
CEF 12 Below 1 0 0%
CEF 13 Above 1 0 0%
CEF 13 In 1 1 100%
CEF 13 Below 1 0 0%
Total 11 4 36.36%
为此,我将查询更改如下:
Select
c.caseName, ci.caseBy, lk.desc Zone,
sum(nvl2(PREPARED, 1, 0)) as cases,
sum(decode(PREPARED, 'Y', 1, 0)) as prepped,
round(avg(CASE WHEN PREPARED = 'Y' THEN 100 ELSE 0 END), 2)||'%' as comp
from
cases c
left outer join
case_info ci on c.tin = ci.tin
left outer join
lk_zone lk on lk.id = c.id
where
c.delete_dt is not null
group by
rollup(caseName, caseBy, lk.descr);
对于 caseName、CaseBy 的所有组合,这并未返回上述 In
和 Below
的预期结果。例如 caseName ABC 和 caseBy 10 没有 Below 记录。在那种情况下,我应该让该行显示为 0 或空值。我也想要定义的总数。
感谢任何帮助。谢谢。
您希望 cross join
生成行,然后 left join
引入数据。您不清楚数据是什么样的,所以我最好的猜测是:
select c.caseName, ci.caseBy, lk.desc, c.prepared
from cases c cross join
lk_zone lk left join
case_info ci
on c.tin = ci.tin and
lk.id = c.id
where c.delete_dt is not null;
然后您可以针对其他列和行修改它。