Group By两列字段时如何将组合的两个字段以表的形式给出

来源:互联网 发布:阿里云大厦 部门 编辑:程序博客网 时间:2024/05/18 00:06

不废话,先上图,下面是我的数据源。


现在希望按B和C来组合分类,期望的结果是下面的。


-----------------------------------------------------------我是分隔君---------------------------------------------------------

对应需要对两个字段进行组合分类,最容易想到的方式就是将B和C两个字段直接放到Group By后面就可以了,例如使用SQL1语句,得到下图。


-----------------------------------------------------------我是分隔君---------------------------------------------------------

但是前面我们也说了,我们想要的是B和C的组合的笛卡尔结果能以列表个形式展示出来。那么怎么办呢?这个时候最容易想到的是用临时的结果,在临时表之上二次查找,如SQL2所示。那么就可以得到下面的结果。


-----------------------------------------------------------我是分隔君---------------------------------------------------------

SQL2解决了问题,但是现实很笨拙,对表扫描了两次,有什么方法可以一次解决呢?是有的,如SQL3所示,这里用到了case when。得到的结果如下。


但是其实case when貌似只能用在sum函数里面的时候,最后的Group By才对sum内部的数据才起作用。avg和count都不行,本质的原因不知道,但是avg和count都与计数有关,估计计数的函数内部是不敏感Group By后面的字段的。

-----------------------------------------------------------我是分隔君---------------------------------------------------------

sql列表

SQL1:Select sum(D)/sum(E),B,C from test.newrain group by B,C

SQL2:

Select t1.C1,t2.C2,t1.Bi from
(select sum(D)/sum(E) as C1, B as Bi from test.newrain where C=1 and F=3 group by B)t1,
(select sum(D)/sum(E) as C2, B as Bi from test.newrain  where C=2 and F=3 group by B)t2
where t1.Bi=t2.Bi;

SQL3:

SELECT 
sum(case when C=1 then D else 0 end)/sum(case when C=1 then E else 0 end) as C1,
sum(case when C=2 then D else 0 end)/sum(case when C=2 then E else 0 end) as C2,B
from test.newrain where F=3
group by B

0 0
原创粉丝点击