原文:在论坛中出现的比较难的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,或者实现方法。

科目是动态的。能实现静态转换也行。

真心谢谢。

我的解法:


  1. if object_id('tab') is not null drop table tab
  2. go
  3. create table tab
  4. (
  5. [班级] varchar(9),[学号] varchar(4),[姓名] varchar(4),
  6. [科目] varchar(11),[得分] varchar(10),[班排名] varchar(9),
  7. [校排名] varchar(10),[标准分] varchar(6)
  8. )
  9. insert tab
  10. select '201班','101','张三','语文','95','1','1','700' union all
  11. select '201班','102','李四','语文','83','2','3','600' union all
  12. select '202班','201','张飞','语文','85','1','2','700' union all
  13. select '202班','202','赵云','语文','75','2','4','600' union all
  14. select '201班','101','张三','数学','83','2','2','600' union all
  15. select '201班','102','李四','数学','85','1','3','700' union all
  16. select '202班','201','张飞','数学','95','1','1','700' union all
  17. select '202班','202','赵云','数学','80','2','4','600'
  18. --------------开始查询--------------------------
  19. declare @sql nvarchar(3000);
  20. set @sql = '';
  21. select @sql =
  22. @sql + ',min(case when 科目=''' + 科目 + ''' then 科目 else null end) as ['+科目+ ']'+
  23. ',min(case when 科目=''' + 科目 + ''' then 得分 else null end) as 得分' +
  24. ',min(case when 科目=''' + 科目 + ''' then 班排名 else null end) as 班排名'+
  25. ',min(case when 科目=''' + 科目 + ''' then 校排名 else null end) as 校排名'+
  26. ',min(case when 科目=''' + 科目 + ''' then 标准分 else null end) as 标准分'
  27. from tab
  28. group by 科目
  29. order by 科目 desc
  30. select @sql = 'select 班级,学号,姓名'+@sql +
  31. ' from tab group by 班级,学号,姓名'
  32. select @sql
  33. exec(@sql)
  34. /*
  35. 班级 学号 姓名 语文 得分 班排名 校排名 标准分 数学 得分 班排名 校排名 标准分
  36. --------- ---- ---- ----------- ---------- --------- ---------- ------ ----------- ---------- --------- ---------- ------
  37. 201班 101 张三 语文 95 1 1 700 数学 83 2 2 600
  38. 201班 102 李四 语文 83 2 3 600 数学 85 1 3 700
  39. 202班 201 张飞 语文 85 1 2 700 数学 95 1 1 700
  40. 202班 202 赵云 语文 75 2 4 600 数学 80 2 4 600
  41. 警告: 聚合或其他 SET 操作消除了 Null 值。
  42. */


上面语句,产生的动态语句:

  1. select 班级,学号,姓名,
  2. min(case when 科目='语文' then 科目 else null end) as [语文],
  3. min(case when 科目='语文' then 得分 else null end) as 得分,
  4. min(case when 科目='语文' then 班排名 else null end) as 班排名,
  5. min(case when 科目='语文' then 校排名 else null end) as 校排名,
  6. min(case when 科目='语文' then 标准分 else null end) as 标准分,
  7. min(case when 科目='数学' then 科目 else null end) as [数学],
  8. min(case when 科目='数学' then 得分 else null end) as 得分,
  9. min(case when 科目='数学' then 班排名 else null end) as 班排名,
  10. min(case when 科目='数学' then 校排名 else null end) as 校排名,
  11. min(case when 科目='数学' then 标准分 else null end) as 标准分
  12. from tab
  13. group by 班级,学号,姓名

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

  1. 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)

    原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  2. 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)

    原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  3. 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)

    原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...

  4. 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  5. 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)

    原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  6. 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)

    原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  7. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  8. 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)

    原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...

  9. 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)

    原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  10. 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)

    原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

随机推荐

  1. Java 数组元素逆序Reverse的三种方式

    Java 数组元素逆序Reverse的三种方式   本文链接:https://blog.csdn.net/xHibiki/article/details/82930521 题目 代码实现 说明 int ...

  2. PorterDuffXfermode之PorterDuff.Mode.SRC_IN

    package com.loaderman.customviewdemo.view; import android.content.Context; import android.graphics.B ...

  3. (十七)Centos之安装配置tomcat8

    第一步:下载Tomcat8压缩包 进入 http://tomcat.apache.org/download-80.cgi 下载tar.gz压缩包 第二步:用ftp工具把压缩包上传到/home/data ...

  4. mysql命令、mysqldump命令找不到解决

    1.解决bash: mysql: command not found 的方法 [root@DB-02 ~]# mysql -u root -bash: mysql: command not found ...

  5. Spring Boot使用JDBC方式连接MySQL

    首先去spring官网下载一个名为test的Spring Boot项目模板:https://start.spring.io/ 然后在mysql中的testdb数据库中新建一张名为test_user的表 ...

  6. Win10安装PostgreSQL9.6

    首先去 官网 下载PostgreSQL 9.6. 可以看到最新版已经到11了,但是我们这里还是以9.6.10版本为例进行下载. 下载好之后点击进行安装,安装期间的一些参数如下: 默认的安装位置是C:\ ...

  7. Windows VS2017 编译 libssh2 1.7.0(执行命令、文件上传、下载)

    下载安装 OpenSSL 要编译 libssh2,必须先编译好 OpenSSL 的静态库,直接从 http://slproweb.com/products/Win32OpenSSL.html 下载已经 ...

  8. 关于VS2010工程各种路径注意事项汇总

    关于VS2010工程各种路径注意事项汇总 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:前段时间调试,利用cmake生成的vs2010工程文件,虽然该 ...

  9. 什么是HybridDB for MySQL (原PetaData)

    云数据库HybridDB for MySQL (原名PetaData)是同时支持海量数据在线事务(OLTP)和在线分析(OLAP)的HTAP(Hybrid Transaction/Analytical ...

  10. vue图片点击放大功能

    因项目需求(ui框架element-ui),需要实现图片的点击放大,还要能旋转以及上下切换.当时第一反应,element-ui好像没有这样的组件,就想过自己写,但是那个旋转翻页上下切换感觉有点麻烦,不 ...