数据查询,行转列的问题。。
根据数据查询得到如下数据表(tab):
班级 学号 姓名 科目 得分 班排名 校排名 标准分
ClassName Code Name SubjectName TotalScore ClassRank SchoolRank TValue
201班 101 张三 语文 95 1 1 700
201班 102 李四 语文 83 2 3 600
202班 201 张飞 语文 85 1 2 700
202班 202 赵云 语文 75 2 4 600
201班 101 张三 数学 83 2 2 600
201班 102 李四 数学 85 1 3 700
202班 201 张飞 数学 95 1 1 700
202班 202 赵云 数学 80 2 4 600
需要得到如下数据:
班级 学号 姓名 语文 得分 班排名 校排名 标准分 数学 得分 班排名 校排名 标准分
201班 101 张三 语文 95 1 1 700 数学 83 2 2 600
201班 102 李四 语文 83 2 3 600 数学 85 1 3 700
202班 201 张飞 语文 85 1 2 700 数学 95 1 1 700
202班 202 赵云 语文 75 2 4 600 数学 80 2 4 600
真心求SQL,或者实现方法。
科目是动态的。能实现静态转换也行。
真心谢谢。 sql 数据库 sqlserver 行转列
[解决办法]
----------------------------------------------------------------
-- Author :DBA_Huangzj(發糞塗牆)
-- Date :2013-10-22 16:18:53
-- Version:
-- Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)
--Dec 28 2012 20:23:12
--Copyright (c) Microsoft Corporation
--Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[tab]
if object_id('[tab]') is not null drop table [tab]
go
create table [tab]([班级] varchar(9),[学号] varchar(4),[姓名] varchar(4),[科目] varchar(11),[得分] varchar(10),[班排名] varchar(9),[校排名] varchar(10),[标准分] varchar(6))
insert [tab]
select '201班','101','张三','语文','95','1','1','700' union all
select '201班','102','李四','语文','83','2','3','600' union all
select '202班','201','张飞','语文','85','1','2','700' union all
select '202班','202','赵云','语文','75','2','4','600' union all
select '201班','101','张三','数学','83','2','2','600' union all
select '201班','102','李四','数学','85','1','3','700' union all
select '202班','201','张飞','数学','95','1','1','700' union all
select '202班','202','赵云','数学','80','2','4','600'
--------------开始查询--------------------------
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([科目])+'=max(case when [科目]='+quotename(科目,'''')+' then [得分] else 0 end)'
+','+quotename('班排名')+'=max(case when [科目]='+quotename(科目,'''')+' then [班排名] else 0 end)'
+','+quotename('校排名')+'=max(case when [科目]='+quotename(科目,'''')+' then [校排名] else 0 end)'
+','+quotename('校排名')+'=max(case when [科目]='+quotename(科目,'''')+' then [校排名] else 0 end)'
from [tab] group by [科目]
exec('select [班级],[学号],[姓名]'+@s+' from [tab] group by [班级],[学号],[姓名]')
----------------结果----------------------------
/*
班级 学号 姓名 数学 班排名 校排名 校排名 语文 班排名 校排名 校排名
--------- ---- ---- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
201班 101 张三 83 2 2 2 95 1 1 1
201班 102 李四 85 1 3 3 83 2 3 3
202班 201 张飞 95 1 1 1 85 1 2 2
202班 202 赵云 80 2 4 4 75 2 4 4
*/
create table #tb(ClassName varchar(10),Code int,Name varchar(10),SubjectName varchar(10),
TotalScore int,ClassRank int,SchoolRank int,TValue int)
insert into #tb
select '201班',101,'张三','语文',95,1,1,700
union all select '201班',102,'李四','语文',83,2,3,600
union all select '202班',201,'张飞','语文',85,1,2,700
union all select '202班',202,'赵云','语文',75,2,4,600
union all select '201班',101,'张三','数学',83,2,2,600
union all select '201班',102,'李四','数学',85,1,3,700
union all select '202班',201,'张飞','数学',95,1,1,700
union all select '202班',202,'赵云','数学',80,2,4,600
declare @sql varchar(8000)
set @sql=''
select @sql=@sql + ',['+rtrim(SubjectName)+']=max(case SubjectName when '''+rtrim(SubjectName)+''' then SubjectName end)
,[得分]=max(case SubjectName when '''+rtrim(SubjectName)+''' then TotalScore end)
,[班排名]=max(case SubjectName when '''+rtrim(SubjectName)+''' then ClassRank end)
,[校排名]=max(case SubjectName when '''+rtrim(SubjectName)+''' then SchoolRank end)
,[标准分]=max(case SubjectName when '''+rtrim(SubjectName)+''' then TValue end)'
from #tb group by SubjectName
exec('select ClassName,Code,Name'+@sql+'from #tb group by ClassName,Code,Name' )
/*
ClassNameCodeName数学得分班排名校排名标准分语文得分班排名校排名标准分
201班101张三数学8322600语文9511700
201班102李四数学8513700语文8323600
202班201张飞数学9511700语文8512700
202班202赵云数学8024600语文7524600
*/
select 班级,学号,姓名,
min(case when 科目='语文' then 科目 else null end) as [语文],
min(case when 科目='语文' then 得分 else null end) as 得分,
min(case when 科目='语文' then 班排名 else null end) as 班排名,
min(case when 科目='语文' then 校排名 else null end) as 校排名,
min(case when 科目='语文' then 标准分 else null end) as 标准分,
min(case when 科目='数学' then 科目 else null end) as [数学],
min(case when 科目='数学' then 得分 else null end) as 得分,
min(case when 科目='数学' then 班排名 else null end) as 班排名,
min(case when 科目='数学' then 校排名 else null end) as 校排名,
min(case when 科目='数学' then 标准分 else null end) as 标准分
from tab
group by 班级,学号,姓名