Group By和Case When的结合使用

下面是数据源。

                                                       图一

现在要按B和C来组合分类,分别计算每种组合情况下D和E的比值,并且按照横轴为C,纵轴为B的形式展示这些比值。期望的结果是下面的。

                                    图二

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

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

                                           图三

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

但是这样得到的结果是将B、C的组合平铺来展示的。如果想要的是B和C分别作为一个表格的横轴和纵轴来展示(如图二),需要怎么办呢?这个时候最容易想到的是用临时表,在临时表之上二次查找,如文章末尾的SQL2所示。那么就可以得到下面的结果。

                                  图四

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

SQL2解决了问题,但是思路比较粗狂,sql里面有没有高级的语法来实现这个功能呢?的确是有的,如SQL3所示,这里用到了case when。得到的结果如下。可以看到和SQL2得到的结果是一样的。

                               图五

但是其实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 group by B)t1,
(select sum(D)/sum(E) as C2, B as Bi from test.newrain  where C=2 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
group by B

猜你喜欢

转载自blog.csdn.net/u010037020/article/details/59696119