设为首页 加入收藏

TOP

一些比较难的sql问题:7(一)
2014-11-23 20:26:15 来源: 作者: 【 】 浏览:35
Tags:一些 比较 sql 问题
一些比较难的sql问题:7
一些比较难的sql问题:6
http://www.2cto.com/database/201311/255687.html
最近,在 论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。
所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
下面的几个问题,都是动态行转列的问题。
1、数据查询,行转列的问题。
根据数据查询得到如下数据表(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,或者实现方法。
科目是动态的。能实现静态转换也行。
真心谢谢。
我的解法:
[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 值。  
  
*/  

上面语句,产生的动态语句:
[sql] 
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 e
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Oracle数据库索引聚簇与哈希聚簇.. 下一篇SQL Server 中各个系统表的作用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: