在论坛中出现的比较难的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格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- vue + elementui form resetFields方法 无法重置表单
this.$refs['form'].resetFields(); 方法无法重置.1 el-form 组件 没有添加 ref 属性 <el-form ref="form" : ...
- 取数据超过内存限制的问题-解决方案(sample,takeSample,filter)
遇到的问题 在处理数据过程中,遇到需要取(n)个数的问题,而当样本量过大的时候,就不能简单的take(n),这类问题一般有两种情况: > - 有序取 TopN > - 无序取 N 先来讨论 ...
- (二)第一个Servlet
一.预备知识 一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个 ...
- hadoop:/bin/bash: /bin/java: No such file or directory
Stack trace: ExitCodeException exitCode=127 In HADOOP_HOME/libexec/hadoop-config.sh look for the if ...
- iOS-UIAlertView与UIActionSheet
UIAlertView与UIActionSheet 6.11.1 常规调用 UIAlertView:调出一个模态对话框,屏幕居中显示 UIActionSheet:非模态对话框,屏幕下方弹出 Alert ...
- fastJson工具类
jar:fast.jar 依赖: <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId&g ...
- 记录一下我的git连接不上GitHub问题
1.日常操作,提交代码,报错误下: $ git clone git@github.com:hanchao5272/myreflect.git Cloning into 'myreflect'... s ...
- 删除Excel表格中一堆英文中的汉字
昨天需要处理一个Excel文件,删除一堆英文里的汉字,开始搜了下方法,没找到,然后手动一个多小时,弄了一半吧也就,结果电脑卡了,忘了保存,就白做了...不知道为啥这次没有自动保存,所以,重要的事说三遍 ...
- 打印网页js
====================================设置打印样式 <style media="print"> .Noprint { display: ...
- 使用自定义Comparator对TreeSet中的数据进行多条件排序
代码记录(需求:根据店铺等级和店铺到某个点的距离进行排序,其中店铺等级由高到低,距离由近及远) 需要排序的对象Store,Store.java package com.zhipengs.work.te ...