日期:2014-05-18  浏览次数:20364 次

sql2005 分组查询归类 帮帮忙..
表结构
姓名 科目 成绩
张三 语文 80
张三 数学 70
里问 语文 80
里问 数学 60
小明 语文 80
小明 数学 60
小明 英语 60


要求得到的结果
姓名 语文 数学 英语
张三 80 70
里问 80 60
小明 80 60 60


科目是不固定的 然后如果还有另外的同学 有物理啊 化学的 结果列表里就要再加上 物理 化学列  
求个SQL语句 或存储过程思路....


------解决方案--------------------
SQL code
----------------------------
-- Author  :fredrickhu(小F,向高手学习)
-- Date    :2011-10-31 16:10:25
-- Version:
--      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86) 
--    Apr 22 2011 11:57:00 
--    Copyright (c) Microsoft Corporation
--    Enterprise Evaluation Edition on Windows NT 6.1 <X64> (Build 7600: ) (WOW64)
--
----------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([姓名] varchar(4),[科目] varchar(4),[成绩] int)
insert [tb]
select '张三','语文',80 union all
select '张三','数学',70 union all
select '里问','语文',80 union all
select '里问','数学',60 union all
select '小明','语文',80 union all
select '小明','数学',60 union all
select '小明','英语',60
--------------开始查询--------------------------
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 科目 when ''' + 科目 + ''' then 成绩 else 0 end) [' + 科目 + ']'
from (select distinct 科目 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql) 
----------------结果----------------------------
/* 姓名   数学          英语          语文
---- ----------- ----------- -----------
里问   60          0           80
小明   60          60          80
张三   70          0           80

(3 行受影响)
*/

------解决方案--------------------
SQL code
----------------------------
-- Author  :fredrickhu(小F,向高手学习)
-- Date    :2011-10-31 16:10:25
-- Version:
--      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86) 
--    Apr 22 2011 11:57:00 
--    Copyright (c) Microsoft Corporation
--    Enterprise Evaluation Edition on Windows NT 6.1 <X64> (Build 7600: ) (WOW64)
--
----------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([姓名] varchar(4),[科目] varchar(4),[成绩] int)
insert [tb]
select '张三','语文',80 union all
select '张三','数学',70 union all
select '里问','语文',80 union all
select '里问','数学',60 union all
select '小明','语文',80 union all
select '小明','数学',60 union all
select '小明','英语',60
--------------开始查询--------------------------
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 科目 when ''' + 科目 + ''' then ltrim(成绩) else '''' end) [' + 科目 + ']'
from (select distinct 科目 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql) 
----------------结果----------------------------
/*姓名   数学           英语           语文
---- ------------ ------------ ------------
里问   60                        80
小明   60           60           80
张三   70                        80

(3 行受影响)

*/

------解决方案--------------------
貌似我整理的这个很合适你.
SQL code

/*
标题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。

问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果): 
姓名 语文 数学 物理 
---- ---- ---- ----
李四 74   84   94
张三 74   83   93
-------------------
*/

create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go

--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
  max(case 课程 when '语文' then 分数 else 0 end) 语文,
  max(case 课程 when '数学' then 分数 else 0 end) 数学,
  max(case 课程 when '物理' then 分数 e