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

数据查询,行转列的有关问题。

2013-10-24 
数据查询,行转列的问题。。根据数据查询得到如下数据表(tab):班级学号姓名科目得分班排名校排名标准分ClassN

数据查询,行转列的问题。。
根据数据查询得到如下数据表(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
*/





[解决办法]
一楼生猛,都已经给出答案了。唉。那给个学习资料吧
http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html
[解决办法]
这个是上面生成的动态语句,便于理解哈:


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 班级,学号,姓名

热点排行