当前位置: 代码迷 >> Sql Server >> 关于交叉表的疑问,多谢
  详细解决方案

关于交叉表的疑问,多谢

热度:83   发布时间:2016-04-27 12:17:29.0
关于交叉表的疑问,谢谢。
对于如下的数据,


统计的结果要求如下:



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

意思是,
同时报了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 #DEMOselect '张三','高中男子甲组','100米','40','1'union allselect '张三','高中男子甲组','110米栏','40','6'union allselect '张三','高中男子甲组','1500米','40','7'union allselect '李四','高中男子甲组','110米栏','41','8'union allselect '李四','高中男子甲组','110米栏','41','9'union allselect '王五','高中男子甲组','100米','42','10'union allselect '王五','高中男子甲组','110米栏','42','11'union allselect '赵六','高中男子甲组','100米','43','12'union allselect '赵六','高中男子甲组','1500米','43','13'union allselect '孙七','高中男子甲组','100米','44','14'SELECT * FROM #DEMODECLARE @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 #DEMOgroup by itemNameset @sql = 'select itemName as [项目],'+ @sql +' count(*) as [项目报名人数]from #DEMO t1group by itemName 'print @sqlEXEC (@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 bon a.athletename = b.athletenamegroup 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 #DEMOselect '张三','高中男子甲组','100米','40','1'union allselect '张三','高中男子甲组','110米栏','40','6'union allselect '张三','高中男子甲组','1500米','40','7'union allselect '李四','高中男子甲组','100米','41','8'union allselect '李四','高中男子甲组','110米栏','41','9'union allselect '王五','高中男子甲组','100米','42','10'union allselect '王五','高中男子甲组','110米栏','42','11'union allselect '赵六','高中男子甲组','100米','43','12'union allselect '赵六','高中男子甲组','1500米','43','13'union allselect '孙七','高中男子甲组','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 #DEMOgroup by itemNameset @sql = 'select a.itemName as [项目]'+ @sql +',count(distinct a.athletename) as [项目报名人数]from #DEMO a,#DEMO bwhere a.athletename = b.athletenamegroup by a.itemName 'print @sqlEXEC (@sql)drop table #DEMO--结果项目    100米    110米栏    1500米    项目报名人数100米    5    3    2    5110米栏    3    3    1    31500米    2    1    2    2
------解决方案--------------------
不行,视图不支持 EXEC 语句,最好用 存储过程,这样好扩展
------解决方案--------------------
加参数自己修改哦,原理一样的

视图不是好东西,这里也用不了
  相关解决方案