首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请教下如下的视图该如何创建呢

2012-05-16 
请问下如下的视图该怎么创建呢?如图三张表生成的Sql语句如下:SQL codeSELECT TOP 100 PERCENT dbo.athlete

请问下如下的视图该怎么创建呢?
如图三张表


生成的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*/--行列转换资料 


[解决办法]

探讨

SQL code
Guide=len(Guide)-len(replace(Guide,'、',''))+1
Coach=len(Coach)-len(replace(Coach,'、',''))+1


这样取记录数

[解决办法]
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*/--一个例子 

热点排行