对于如下的数据,
统计的结果要求如下:
这是一个体育赛事的兼项统计表。
意思是,
同时报了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 语句,最好用 存储过程,这样好扩展
------解决方案--------------------
加参数自己修改哦,原理一样的
视图不是好东西,这里也用不了