日期:2014-05-18  浏览次数:20631 次

请高手看看如何实现这个查询?
之前的问过一个查询。
现在又有新的需求。如下表
姓名 城市 单位 单位性质
王一 北京 联通 事业法人
王二 北京 网通 事业法人
王三 北京 电信 企业法人
王四 北京 移动 企业法人
王五 北京 网通 事业法人
王六 上海 联通 事业法人
王七 上海 移动 企业法人
王八 上海 移动 企业法人
王九 上海 网通 事业法人
王十 上海 铁通 事业法人


第一次的需求是要查询北京,上海事业法人、企业法人的员工数量
  事业单位员工数 企业单位员工数  
北京 3 2
上海 3 2

使用的这个查询 select 事业法人= sum(case 单位性质='事业法人' then 1 else 0 end) ,
企业法人=sum(case 单位性质='企业法人' then 1 else 0 end)
  from tb group by 城市


现在要得需求跟高了,需要查询北京,上海事业法人,企业法人的单位数量。
这意味着要再城市分组的基础上再对单位进行分组统计。既如下效果:
  事业单位数 企业单位数
北京 2 2
上海 3 1

实在不知道这个查询应该怎么个写法。

------解决方案--------------------
怎么不自己做做再来问?
------解决方案--------------------
SQL code
select 事业单位数= case 单位性质='事业法人'  then count(单位) else 0 end ,
企业单位数=case 单位性质='企业法人' then count(单位)  else 0 end
  from tb group by 城市

------解决方案--------------------
探讨

SQL code
select 事业单位数= case 单位性质='事业法人' then count(单位) else 0 end ,
企业单位数=case 单位性质='企业法人' then count(单位) else 0 end
from tb group by 城市

------解决方案--------------------
SQL code


drop table tb
create table tb (姓名 varchar(4),城市 varchar(4),单位 varchar(4),企业性质  varchar(8))


insert into tb select     '王一',    '北京',    '联通',    '事业法人' 
insert into tb select     '王二',    '北京',    '网通',    '事业法人' 
insert into tb select     '王三',    '北京',    '电信',    '企业法人'
insert into tb select     '王四',    '北京',    '移动',    '企业法人'    
insert into tb select     '王五',    '北京',    '网通',    '事业法人'
insert into tb select     '王六',    '上海',    '联通',    '事业法人'
insert into tb select     '王七',    '上海',    '移动',    '企业法人'
insert into tb select     '王八',    '上海',    '移动',    '企业法人'
insert into tb select     '王九',    '上海',    '网通',    '事业法人'
insert into tb select     '王十',    '上海',    '铁通',    '事业法人'        

select 城市,sum(case when 企业性质='事业法人' then 1 else 0 end) '事业法人',
sum(case when 企业性质='企业法人' then 1 else 0 end) '企业法人'
from
(select distinct 城市,单位,企业性质 from tb )A
group by 城市


/*
城市   事业法人        企业法人        
---- ----------- ----------- 
北京   2           2
上海   3           1

(所影响的行数为 2 行)
*/

------解决方案--------------------
SQL code
--现在又有新的需求。如下表
--姓名 城市 单位 单位性质
--王一 北京 联通 事业法人
--王二 北京 网通 事业法人

--王三 北京 电信 企业法人

--王四 北京 移动 企业法人
--王五 北京 网通 事业法人
--王六 上海 联通 事业法人
--王七 上海 移动 企业法人
--王八 上海 移动 企业法人
--王九 上海 网通 事业法人
--王十 上海 铁通 事业法人

if OBJECT_ID('tb') is not null 
drop table tb 
go 
create table tb(姓名 varchar(50),城市 varchar(50),单位 varchar(50), 单位性质 varchar(50))
insert into tb select '王一','北京','联通','事业法人' union all
select '王二','北京','网通','事业法人' union all
select '王三','北京','电信','企业法人' union all

select '王四','北京','移动','企业法人' union all
select '王五','北京','网通','事业法人' union all
select '王六','上海','联通','事业法人' union all
select '王七','上海','移动','企业法人' union all
select '王八','上海','移动','企业法人' union all
select '王九','上海','网通','事业法人' union all
select '王十','上海','铁通','事业法人'  

select * from tb

--第一次的需求是要查询北京,上海事业法人、企业法人的员工数量
--       事业单位员工数 企业单位员工数   
-- 北京     3                   2
-- 上海     3                   2
select 城市,
sum(case when 单位性质='事业法人' then 1 else 0 end )as '事业单位员工数' ,
sum(case when 单位性质='企业法人' then 1 else 0 end)  as '企业单位员工数'

 from tb group by 城市



 城市                         事业单位员工数     企业单位员工数
----------------------------- -----------         -----------
北京                              3                  2
上海                              3                  2

(2 行受影响)