所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
下面的几个问题,都是动态行转列的问题。
数据查询,行转列的问题。
http://bbs.csdn.net/topics/390621630?page=1#post-395855019
根据数据查询得到如下数据表(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,或者实现方法。
科目是动态的。能实现静态转换也行。
真心谢谢。
我的解法:
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 @sql nvarchar(3000);
set @sql = '';
select @sql =
@sql + ',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 科目
order by 科目 desc
select @sql = 'select 班级,学号,姓名'+@sql +
' from tab group by 班级,学号,姓名'
select @sql
exec(@sql)
/*
班级 学号 姓名 语文 得分 班排名 校排名 标准分 数学 得分 班排名 校排名 标准分
--------- ---- ---- ----------- ---------- --------- ---------- ------ ----------- ---------- --------- ---------- ------
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
警告: 聚合或其他 SET 操作消除了 Null 值。
*/
上面语句,产生的动态语句:
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 班级,学号,姓名