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 的所有组合,这并未返回上述 InBelow 的预期结果。例如 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;

然后您可以针对其他列和行修改它。