在论坛中出现的比较难的sql问题:6(动态行转列 考试科目、排名动态列问题)
原文:在论坛中出现的比较难的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 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 班级,学号,姓名
在论坛中出现的比较难的sql问题:6(动态行转列 考试科目、排名动态列问题)的更多相关文章
- 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)
原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)
原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...
- 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)
原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...
- 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)
原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)
原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)
原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)
原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...
- 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)
原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)
原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- git常见问题之git pull时Please specify which branch you want to merge with.
$ git pull时遇到如下提示 $ git pull warning: no common commits remote: Counting objects: 5, done. remote: C ...
- python arcgis
- Javescript——变量声明的区别
原文链接:ES6 Syntax and Feature Overview View on GitHub Keyword Scope Hoisting Can Be Reassigned Can Be ...
- HmacSHA256算法(C# 和 Java)
Java代码: /** * HmacSHA256算法,返回的结果始终是32位 * @param key 加密的键,可以是任何数据 * @param content 待加密的内容 * @return 加 ...
- Can't create a new thread (errno 11) 解决办法 mysql无法连接
问题的现象: 错误信息: ERROR 1135 (00000): Can't create a new thread (errno 11); if you are not out of availab ...
- 浅谈service、DAO层引入(转)
转自 http://www.4u4v.net/mvc-simple-enough-on-the-introduction-of-service-dao-layer.html MVC是web开发中常见的 ...
- Cognos Framework操作记录
备注:这是我单位内部的Cognos Framework配置记录,里面涉及的名字等信息在其他使用环境需要进行相应修改. Cognos数据包配置 打开CYFTest项目, 右键点击andwdb的物理视图 ...
- 细说可空类型 nullable PropertyType
可空类型是System.Nullable结构体的实列.一个可空类型代表了相应值类型的正确范围附加null值.这么说来,其实也不是很明子,命题嘛,一般不求易懂,但求准确. 那我就来说说这可空类型吧,上次 ...
- 【Leetcode_easy】706. Design HashMap
problem 706. Design HashMap solution1: class MyHashMap { public: /** Initialize your data structure ...
- OpenCV计算机视觉实战(Python版)资源
疲劳检测 pan.baidu.com/s/1Ng_-utB8BSrXlgVelc8ovw #导入工具包 from scipy.spatial import distance as dist from ...