Oracle通过group by对两个值进行分类并显示特定格式
今天遇见一个问题:需要根据id和field对表sys进行分类,其中field只有两个值“1”和“0”,并且要求获取结果的返回样式如下:
id | field==1 | field==0 |
---|---|---|
12 | 1 | 7 |
13 | 4 | 32 |
主要有两种方法采用两种方法解决(第一种较为繁琐,推荐第二种)
第一种方式
主要采用分类查询然后再全连接的方式,注意一定要全连接,如果是只用左连接或右连接会致使数据不全。
SELECT
aa.id,"field==1","field==0"
FROM
( SELECT id, COUNT( field ) "field==1" FROM sys WHERE field = 1 GROUP BY id ) aa FULL
JOIN ( SELECT id, COUNT( field ) "field==0" FROM sys WHERE field = 0 GROUP BY id ) bb ON aa.id = bb.id
第二种方式
第二种方法主要利用了count(列名),其中如果该内容为null,则不进行计算,否则进行计算的原理,这样就将两个语句的连接查询转为一句,更为简便了。
SELECT
id,
count(decode( field, '1', 1, NULL )) "field==1",
count(decode( field, '0', 1, NULL )) "field==0"
FROM
sysman
GROUP BY
id
结果展示
发散思维
感觉还可以用行列转换的思维,这个方法还没有试,有待实验。