我试图一起使用CASE和GROUP BY来有条件地过滤结果,只要它们符合CASE标准,如果它们不符合,则返回结果,好像没有指定GROUP BY标准.
这是我所拥有的简单模型:
es.id | es.acct_num | p.id | p.name
1001 | 4306-0 | 1569 | The High School
1002 | 4306-0 | 1569 | The High School
665 | 5906-7 | 981 | Rec Center
783 | 5906-7 | 1221 | The Gym
这就是我想看到的:
es.id | es.acct_num | p.id | p.name
1001 | 4306-0 | 1569 | The High School
1002 | 4306-0 | 1569 | The High School
0 | 5906-7 | 0 | MULTI-SITE
由于es.acct_num 5906-7有超过1个不同的关联p.id,我希望它按es.acct_num分组为1行项,然后将es.id,p.id表示为’0′,并且具有由字符串’MULTI-SITE’表示的p.name.
但是,由于es.acct_num 4306-0只有1个不同的关联p.id,我希望这些都作为单独的行项返回,就像没有应用分组条件一样.
解决方案逃脱了我.我怎么能做到这一点?
解决方法:
您可以使用条件聚合执行此操作:
SELECT (case when count(*) > 1 then 0 else max(es.id) end) as esid,
es.acct_num,
(case when count(*) > 1 then 0 else max(p.id) end) as pid,
(case when count(*) > 1 then 'MULTI-SITE' else p.name end) as name,
COUNT(*) AS cnt
FROM es join
p
on . . .
GROUP BY es.acct_num;
不要被max()表达式所迷惑.案例的那一部分只有一行,所以这些只返回该行的值.
编辑:
我认为您需要使用相关子查询,连接/聚合或使用变量计算值.使用窗口函数,几乎任何其他数据库都会更容易.这是一个想法,如果没有看到完整的查询,有点难以详细表达:
SELECT (case when esp.cnt > 1 then 0 else max(es.id) end) as esid,
es.acct_num,
(case when esp.cnt > 1 then 0 else max(p.id) end) as pid,
(case when esp.cnt > 1 then 'MULTI-SITE' else p.name end) as name
FROM es join
p
on . . . join
(select es.acct_num, count(distinct p.id) as cnt
from . . .
group by es.acct_num
) esp
on esp.acct_num = es.acct_num
GROUP BY es.acct_num, (case when cnt = 0 then es.id end);