在论坛中出现的比较难的sql问题:6(动态行转列 考试科目、排名动态列问题)

假如想象 提交于 2019-12-11 00:12:26
原文:在论坛中出现的比较难的sql问题:6(动态行转列 考试科目、排名动态列问题)

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。


下面的几个问题,都是动态行转列的问题。

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

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 tabgo create table tab([班级] varchar(9),[学号] varchar(4),[姓名] varchar(4),[科目] varchar(11),[得分] varchar(10),[班排名] varchar(9),[校排名] varchar(10),[标准分] varchar(6)) insert tabselect '201班','101','张三','语文','95','1','1','700' union allselect '201班','102','李四','语文','83','2','3','600' union allselect '202班','201','张飞','语文','85','1','2','700' union allselect '202班','202','赵云','语文','75','2','4','600' union allselect '201班','101','张三','数学','83','2','2','600' union allselect '201班','102','李四','数学','85','1','3','700' union allselect '202班','201','张飞','数学','95','1','1','700' union allselect '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 tabgroup 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          600201班      102  李四   语文          83         2         3          600    数学          85         1         3          700202班      201  张飞   语文          85         1         2          700    数学          95         1         1          700202班      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 班级,学号,姓名

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!