Mysql – 条件组

我试图一起使用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);
上一篇:ubuntu下apache重启报Could not reliably determine the server’s fully......


下一篇:SQL重复记录查询-count与group by having结合查询重复记录