SQL动态化多个分组查询

现有以下三张表,分别为:diqu(地区表),zhiye(职业表),info(信息表)

最基本的分组查询

1 select dqID,jbID,COUNT(1) from info group by dqID,jbID

这样就得到info(信息表)里各地区、各职业的人数。如果想看得更直观,可以用inner join

1 select MAX(dqName) 地区,MAX(zyName) 职业,COUNT(1) 人数 from info 
2 inner join diqu on info.dqID=diqu.ID 
3 inner join zhiye on info.zyID=zhiye.ID 
4 group by dqID,zyID order by dqID

得到结果:

可是这样只能查到info(信息表)里的人数,如果我们需要查询每个地区、职业的人数,可以用cross join

1 select dqName 地区,zyName 职业,(select COUNT(1) from info where dqID=c.dqID and zyID=c.zyID) 人数 from 
2 (select dqName,diqu.ID dqID,zyName,zhiye.ID zyID from diqu cross join zhiye) c 
3 order by c.dqID

得到结果:

这样就得到我们想要的结果,可还是不够直观,可以再列转行

1 DECLARE @sql VARCHAR(8000)
2 SELECT @sql=isnull(@sql+',','')+zyName FROM zhiye order BY ID
3 SET @sql='select * from (
4 select dqID,dqName 地区,zyName 职业,(select COUNT(1) from info where dqID=c.dqID and zyID=c.zyID) 人数 from
5 (select dqName,diqu.ID dqID,zyName,zhiye.ID zyID from diqu cross join zhiye) c
6 ) b pivot (max(人数) for 职业 in ('+@sql+'))a'
7 exec(@sql)

得到结果:

转载于:https://www.cnblogs.com/desertion/p/9509162.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值