在论坛中出现的比较难的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格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- python datetime库使用和时间加减计算
datetime库使用 一.操作当前时间 1.获取当前时间 >>> import datetime >>> print datetime.datetime.now( ...
- Struts2 入门笔记
一.介绍 1.Struts网站 https://struts.apache.org/ struts 是通过基于请求响应模式的应用framework 1) 控制器(Controller)--控制整个Fr ...
- Centos 7 下 Corosync + Pacemaker + DRBD + psc + crmsh 实现 mysql 服务高可用
一.介绍 高可用,大家可能会想到比较简单的Keepalived,或者更早一点的 heartbeat,也可能会用到 Corosync+Pacemaker,那么他们之间有什么区别. Heartbeat到了 ...
- 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_10-SpringSecurityOauth2研究-校验令牌&刷新令牌
3.5校验令牌 Spring Security Oauth2提供校验令牌的端点,如下: Get: http://localhost:40400/auth/oauth/check_token?token ...
- 一百四十四:CMS系统之评论布局和功能二
在base页加一个登录标识符 给加页面两个id,方便取值 js $(function () { //初始化ueditor var ue = UE.getEditor('editor', { 'serv ...
- SpringCloud学习成长之路二 服务客户端(rest+ribbon)
在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的. Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是f ...
- C#线程 BeginInvoke和EndInvoke使用方法
一.C#线程概述 在操作系统中一个进程至少要包含一个线程,然后,在某些时候需要在同一个进程中同时执行多项任务,或是为了提供程序的性能,将要执行的任务分解成多个子任务执行.这就需要在同一个进程中开启多个 ...
- iOS面试题超全!
之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家.(题目来源于网络,侵删) 1. Object-c的类可以多重继承么?可以实现多个接口么?Cat ...
- linux服务器常用密令
1. 什么是linux服务器load average? Load是用来度量服务器工作量的大小,即计算机cpu任务执行队列的长度,值越大,表明包括正在运行和待运行的进程数越多.参考资料:http://e ...
- Python小技巧:使用一行命令把你的电脑变成服务器
不知道你有没有遇到这么一种情况,就是你有时候想要把电脑上的一些东西传输到你的手机或者 Pad ,你要么需要使用数据线连接到电脑,有时候还要装各种驱动才可以进行数据传输,要么需要借助第三方的工具,在局域 ...