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

问个多行转多列的有关问题

2012-05-03 
问个多行转多列的问题查了很久都不知道怎么处理,只能来求助了希望各位帮帮忙。列子表结构如下姓名性别张三

问个多行转多列的问题
查了很久都不知道怎么处理,只能来求助了
希望各位帮帮忙。

列子表结构如下

姓名 性别
张三 男
李四 男
王二 男
小龙女 女
张飞 男
吕布 男
。。。。。

我想得到以下的显示结果

姓名 性别 姓名 性别
张三 男 李四 男
王二 男 小龙女 女
张飞 男 吕布 男
。。。。。


如果一行显示三个人又怎么写?
这是一行显示两个人这样的SQL怎么写?





[解决办法]
在下面的语句上修改一下就可以了

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
--行列互转
--摘自中国风博客,引用请标明内容来源
--1、行换列
if object_id('Class') is not null
drop table Class
Go
Create table Class(
[Student] nvarchar(2),
[Course] nvarchar(2),
[Score] int)
……

[解决办法]
SQL code
CREATE TABLE #tb([姓名] VARCHAR(20),[性别] VARCHAR(5))INSERT INTO #tbSELECT '张三', '男' UNION ALLSELECT '李四', '男' UNION ALLSELECT '王二', '男' UNION ALLSELECT '小龙女', '女' UNION ALLSELECT '张飞', '男' UNION ALLSELECT '吕布', '男'SELECT ROW_NUMBER() OVER (ORDER BY 姓名 DESC ) AS num ,*FROM #tb SELECT max(case when (num - 1)/n.cnt = 0 then 姓名 else null end) 姓名,       max(case when (num - 1)/n.cnt = 0 then 性别 else null end) 性别,       max(case when (num - 1)/n.cnt = 1 then 姓名 else null end) 姓名,       max(case when (num - 1)/n.cnt = 1 then 性别 else null end) 性别FROM (SELECT ROW_NUMBER() OVER (ORDER BY 姓名 DESC ) AS num ,* FROM #tb ) m,    (SELECT case when count(1)%2 = 0 then count(1)/2 else count(1)/2 + 1 end cnt from #tb )n    GROUP BY (num-1)%n.cnt/*姓名                   性别    姓名                   性别-------------------- ----- -------------------- -----张三                   男     王二                   男张飞                   男     吕布                   男小龙女                 女     李四                   男警告: 聚合或其他 SET 操作消除了 Null 值。(3 行受影响)*/        SELECT max(case when (num - 1)/n.cnt = 0 then 姓名 else null end) 姓名,       max(case when (num - 1)/n.cnt = 0 then 性别 else null end) 性别,       max(case when (num - 1)/n.cnt = 1 then 姓名 else null end) 姓名,       max(case when (num - 1)/n.cnt = 1 then 性别 else null end) 性别,       max(case when (num - 1)/n.cnt = 2 then 姓名 else null end) 姓名,       max(case when (num - 1)/n.cnt = 2 then 性别 else null end) 性别FROM (SELECT ROW_NUMBER() OVER (ORDER BY 姓名 DESC ) AS num ,* FROM #tb ) m,    (SELECT case when count(1)%3 = 0 then count(1)/3 else count(1)/3 + 1 end cnt from #tb )n    GROUP BY (num-1)%n.cnt/*姓名                   性别    姓名                   性别    姓名                   性别-------------------- ----- -------------------- ----- -------------------- -----张三                   男     小龙女                 女     吕布                   男张飞                   男     王二                   男     李四                   男警告: 聚合或其他 SET 操作消除了 Null 值。(2 行受影响)*/
[解决办法]
SQL code
DROP TABLE tbbCREATE TABLE tbb(     名字 VARCHAR(100),    性别 VARCHAR(100))GOINSERT INTO tbbSELECT '张三','男' UNIONSELECT '李四', '男' UNIONSELECT '王二', '男' UNIONSELECT '小龙女', '女' UNIONSELECT '张飞', '男' UNIONSELECT '吕布', '男' SELECT A.名字,A.性别,B.名字,B.性别FROM (SELECT RN=ROW_NUMBER() OVER (ORDER BY [名字]),[名字],[性别]    FROM tbb) as A,(SELECT RN=ROW_NUMBER() OVER (ORDER BY [名字]),[名字],[性别]    FROM tbb) AS BWHERE A.RN = B.RN - 1 AND A.RN%2 = 1 AND B.RN%2 = 0名字    性别    名字    性别李四    男    吕布    男王二    男    小龙女    女张飞    男    张三    男 

热点排行
Bad Request.