没有行转列的正确SQL:
select d.Region,d.MODEL,count(d.WLAN_MAC) as “数量” from deviceinfo as d GROUP BY d.Region,d.MODEL;
本人本人写的的行转列,格式正确,但是数量错误:
select d.region,
count(if(d.MODEL=”TO301″,d.WLAN_MAC,0)) as “TO301″,
count(if(d.MODEL=”TO302”,d.WLAN_MAC,0)) as “TO302″,
count(if(d.MODEL=”TO303”,d.WLAN_MAC,0)) as “TO303”,
count(*) as “总数”
from deviceinfo as d GROUP BY d.Region,d.MODEL ;
注意:没有没有数量那一栏,所以只能用count,然而count求数量并没有求出分组后的正确值,求高手献上高招。折磨两天了。不行转列查询出的都是正确的,但是效果不对。
select d.Region,d.MODEL,count(d.WLAN_MAC) as “数量” from deviceinfo as d GROUP BY d.Region,d.MODEL;
本人本人写的的行转列,格式正确,但是数量错误:
select d.region,
count(if(d.MODEL=”TO301″,d.WLAN_MAC,0)) as “TO301″,
count(if(d.MODEL=”TO302”,d.WLAN_MAC,0)) as “TO302″,
count(if(d.MODEL=”TO303”,d.WLAN_MAC,0)) as “TO303”,
count(*) as “总数”
from deviceinfo as d GROUP BY d.Region,d.MODEL ;
注意:没有没有数量那一栏,所以只能用count,然而count求数量并没有求出分组后的正确值,求高手献上高招。折磨两天了。不行转列查询出的都是正确的,但是效果不对。
解决方案
10
select d.region, count(CASE d.MODEL WHEN "TO301" THEN 1 END) as "TO301", count(CASE d.MODEL WHEN "TO302" THEN 1 END) as "TO302", count(CASE d.MODEL WHEN "TO303" THEN 1 END) as "TO303", count(*) as "总数" from deviceinfo as d GROUP BY d.Region;
10
这里要注意的是 count(0) 和 count(1) 和 count(*) 是一样的 。
原因是count只要字段值不是null,那么就是1,只有在null的时候,count出来的值才是0.
假如你换成sum 就对了。
原因是count只要字段值不是null,那么就是1,只有在null的时候,count出来的值才是0.
假如你换成sum 就对了。
20
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382
参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx … 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。