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

关于交叉表的疑问,谢谢。
对于如下的数据,


统计的结果要求如下:



这是一个体育赛事的兼项统计表。

意思是,
同时报了100米 和100米栏的有 张三、李四、王五 3人
同时报了100米 和1500米的有 张三、赵六 2人
同时报了100米栏 和1500米的有 张三 1人

请问这种Sql语句怎么写呢?
我知道是交叉表,但是,这种应该比交叉表难些的吧,再交叉表的基础上又做了统计。谢谢。~



------解决方案--------------------
看一下这个 是不是你想要的,不容易呀,用了我20分钟
SQL code


CREATE TABLE #DEMO(athleteName VARCHAR(100),fullName VARCHAR(100),itemName varchar(100),athleteId varchar(100) ,id varchar(100))

insert into #DEMO
select '张三','高中男子甲组','100米','40','1'
union all
select '张三','高中男子甲组','110米栏','40','6'
union all
select '张三','高中男子甲组','1500米','40','7'
union all
select '李四','高中男子甲组','110米栏','41','8'
union all
select '李四','高中男子甲组','110米栏','41','9'
union all
select '王五','高中男子甲组','100米','42','10'
union all
select '王五','高中男子甲组','110米栏','42','11'
union all
select '赵六','高中男子甲组','100米','43','12'
union all
select '赵六','高中男子甲组','1500米','43','13'
union all
select '孙七','高中男子甲组','100米','44','14'


SELECT * FROM #DEMO

DECLARE @sql varchar(8000)
set @sql = '';

select @sql = @sql + ' (select count(1) from #DEMO A INNER JOIN (SELECT athleteName FROM #DEMO WHERE itemName=''' 
    + itemName + ''' GROUP BY athleteName ) B ON A.athleteName=B.athleteName AND A.itemName=t1.itemName ) AS ['+itemName+'], '
from #DEMO
group by itemName


set @sql = 'select itemName as [项目],'+ @sql +' count(*) as [项目报名人数]
from #DEMO t1
group by itemName '

print @sql
EXEC (@sql)

drop table #DEMO

------解决方案--------------------
SQL code
select a.itemname
,sum(case when b.itemname = '100米' then 1 else 0 end) as [100米]
,sum(case when b.itemname = '100米栏' then 1 else 0 end) as [100米栏]
,sum(case when b.itemname = '1500米' then 1 else 0 end) as [1500米]
from tab a inner join tab b
on a.athletename = b.athletename
group by a.itemname

------解决方案--------------------
SQL code
CREATE TABLE #DEMO(athleteName VARCHAR(100),fullName VARCHAR(100),itemName varchar(100),athleteId varchar(100) ,id varchar(100))

insert into #DEMO
select '张三','高中男子甲组','100米','40','1'
union all
select '张三','高中男子甲组','110米栏','40','6'
union all
select '张三','高中男子甲组','1500米','40','7'
union all
select '李四','高中男子甲组','100米','41','8'
union all
select '李四','高中男子甲组','110米栏','41','9'
union all
select '王五','高中男子甲组','100米','42','10'
union all
select '王五','高中男子甲组','110米栏','42','11'
union all
select '赵六','高中男子甲组','100米','43','12'
union all
select '赵六','高中男子甲组','1500米','43','13'
union all
select '孙七','高中男子甲组','100米','44','14'


DECLARE @sql varchar(8000)
set @sql = '';

select @sql = @sql + ',sum(case when b.itemname = ''' + itemName + ''' then 1 else 0 end) as [' + itemName + ']' 
from #DEMO
group by itemName


set @sql = 'select a.itemName as [项目]'+ @sql +',count(distinct a.athletename) as [项目报名人数]
from #DEMO a,#DEMO b
where a.athletename = b.athletename
group by a.itemName '

print @sql
EXEC (@sql)

drop table #DEMO

--结果
项目    100米    110米栏    1500米    项目报名人数
100米    5    3    2    5
110米栏    3    3    1    3
1500米    2    1    2    2

------解决方案--------------------
不行,视图不支持 EXEC 语句,最好用 存储过程,这样好扩展
------解决方案--------------------
加参数自己修改哦,原理一样的

视图不是好东西,这里也用不了