请问下如下的视图该怎么创建呢?
如图三张表
生成的Sql语句如下:
- SQL code
SELECT TOP 100 PERCENT dbo.athlete.name AS athleteName, dbo.unitInfo.name AS unitName, dbo.unitInfo.guide, dbo.unitInfo.coach, dbo.unitInfo.worker, dbo.unitInfo.teamDoctor, dbo.athlete.userId, dbo.athlete.idFROM dbo.athlete INNER JOIN dbo.unitGroup ON dbo.athlete.unitGroup = dbo.unitGroup.id INNER JOIN dbo.unitInfo ON dbo.unitGroup.unitInfo = dbo.unitInfo.idORDER BY dbo.unitInfo.name
查询出的数据如下:
现在要统计出如下的结果:
男运动员数女运动员数领队数教练数队医数
江岸区 2 1 2 6 1
口区 1 2 1 1 1
主要是教练,这里面的字符串 是用顿号分开的,
例如
- SQL code
蔡幸福、金燕妮、蔡幸福、金燕妮、蔡幸福、金燕妮
这是6个人~
上面的各项直接用count 的话,列出的是所有的记录数呢,~
[解决办法]
- SQL code
Guide=len(Guide)-len(replace(Guide,'、',''))+1Coach=len(Coach)-len(replace(Coach,'、',''))+1
[解决办法]
- SQL code
--行列互转--摘自中国风博客,引用请标明内容来源--1、行换列if object_id('Class') is not null drop table ClassGoCreate table Class([Student] nvarchar(2),[Course] nvarchar(2),[Score] int)Insert Classselect N'张三',N'语文',78 union allselect N'张三',N'数学',87 union allselect N'张三',N'英语',82 union allselect N'张三',N'物理',90 union allselect N'李四',N'语文',65 union allselect N'李四',N'数学',77 union allselect N'李四',N'英语',65 union allselect N'李四',N'物理',85 Go--2000方法:--动态:declare @s nvarchar(4000)set @s=''Select @s=@s+','+quotename([Course])+'=max(case when [Course]=' +quotename([Course],'''')+' then [Score] else 0 end)'from Class group by[Course]--select @sexec('select [Student]'+@s+' from Class group by [Student]')--生成静态:select [Student], [数学]=max(case when [Course]='数学' then [Score] else 0 end), [物理]=max(case when [Course]='物理' then [Score] else 0 end), [英语]=max(case when [Course]='英语' then [Score] else 0 end), [语文]=max(case when [Course]='语文' then [Score] else 0 end) from Class group by [Student]GO--动态:declare @s nvarchar(4000)Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course]select @sexec('select * from Class pivot (max([Score]) for [Course] in('+@s+'))b')--生成静态:select * from Class pivot (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b--生成格式:/*Student 数学 物理 英语 语文------- ----------- ----------- ----------- -----------李四 77 85 65 65张三 87 90 82 78(2 行受影响)*/go--加上总成绩(学科平均分)--2000方法:--动态:declare @s nvarchar(4000)set @s=''Select @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+'then [Score] else 0 end)'from Class group by[Course]exec('select [Student]'+@s+',[总成绩]=sum([Score]) from Class group by [Student]')--加多一列(学科平均分用avg([Score]))生成动态:select [Student], [数学]=max(case when [Course]='数学' then [Score] else 0 end), [物理]=max(case when [Course]='物理' then [Score] else 0 end), [英语]=max(case when [Course]='英语' then [Score] else 0 end), [语文]=max(case when [Course]='语文' then [Score] else 0 end), [总成绩]=([Score]) --加多一列(学科平均分用avg([Score]))from Class group by [Student]go--2005方法:动态:declare @s nvarchar(4000)Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course] --isnull(@s+',','') 去掉字符串@s中第一个逗号exec('select [Student],'+@s+',[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a pivot (max([Score]) for [Course] in('+@s+'))b ')--生成静态:select [Student],[数学],[物理],[英语],[语文],[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a --平均分时用avg([Score])pivot (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b 生成格式:/*Student 数学 物理 英语 语文 总成绩------- ----------- ----------- ----------- ----------- -----------李四 77 85 65 65 292张三 87 90 82 78 337(2 行受影响)*/go--2、列转行 if not object_id('Class') is null drop table ClassGoCreate table Class([Student] nvarchar(2),[数学] int,[物理] int,[英语] int,[语文] int)Insert Classselect N'李四',77,85,65,65 union allselect N'张三',87,90,82,78Go--2000:动态:declare @s nvarchar(4000)select @s=isnull(@s+' union all ','')+'select [Student],[Course]='+quotename(Name,'''')--isnull(@s+' union all ','') 去掉字符串@s中第一个union all+',[Score]='+quotename(Name)+' from Class'from syscolumns where ID=object_id('Class') and Name not in('Student')--排除不转换的列order by Colidexec('select * from ('+@s+')t order by [Student],[Course]')--增加一个排序生成静态:select * from (select [Student],[Course]='数学',[Score]=[数学] from Class union all select [Student],[Course]='物理',[Score]=[物理] from Class union all select [Student],[Course]='英语',[Score]=[英语] from Class union all select [Student],[Course]='语文',[Score]=[语文] from Class)t order by [Student],[Course]go--2005:动态:declare @s nvarchar(4000)select @s=isnull(@s+',','')+quotename(Name)from syscolumns where ID=object_id('Class') and Name not in('Student') order by Colidexec('select Student,[Course],[Score] from Class unpivot ([Score] for [Course] in('+@s+'))b')goselect Student,[Course],[Score] from Class unpivot ([Score] for [Course] in([数学],[物理],[英语],[语文]))b生成格式:/*Student Course Score------- ------- -----------李四 数学 77李四 物理 85李四 英语 65李四 语文 65张三 数学 87张三 物理 90张三 英语 82张三 语文 78*/--行列转换资料
[解决办法]
[解决办法]
select 地区,sum(case when 性别='男'then 1 else 0 end ),
sum(case when 性别='女'then 1 else 0 end )
count(guide),sum(len(教练)-len(replace(教练,'、',''))),
count(队医)
from
......
[解决办法]
- SQL code
select 地区,sum(case when 性别='男'then 1 else 0 end ),sum(case when 性别='女'then 1 else 0 end )count(guide),sum(len(教练)-len(replace(教练,'、',''))+1),count(队医)from......
[解决办法]
- SQL code
goif OBJECT_ID('test')is not nulldrop table testgocreate table test(Aname varchar(50),Area varchar(20),Cname varchar(50),Dname varchar(30))goinsert testselect 'tracy','DALIAN','NA、NB、NC','DN' union allselect 'nash','DALIAN','NA、NB、NC','DN' union allselect 'kobe','DALIAN','NA、NB、NC','DN' union allselect 'JAME','SHENYANG','NA、NM、NC','DN' union allselect 'WADE','SHENYANG','NA、NB、NC','DN' union allselect 'KONGKA','SHENYANG','NA、NB、ND','DN' union allselect 'LUCCIA','SHENYANG','NA、NB、NC','DN,GN'CREATE VIEW v_viewASSELECT DISTINCT COUNT(Aname)OVER(PARTITION BY Area) AS Aname, Area,LEN(Cname)-LEN(REPLACE(Cname,'、',''))+1 AS Cname, LEN(Dname)-LEN(REPLACE(Dname,'、',''))+1 AS DnameFROM test /*Aname Area Cname Dname3 DALIAN 3 14 SHENYANG 3 1*/--一个例子