当前位置: 代码迷 >> Sql Server >> 怎么实现该查询?
  详细解决方案

怎么实现该查询?

热度:54   发布时间:2016-04-27 14:40:33.0
如何实现该查询???
tb table

city 地区 户口
北京 西城 城镇
北京 西城 乡村
北京 东城 城镇
北京 东城 乡村
北京 西城 乡村
上海 浦东 乡村
上海 浦东 城镇
上海 浦东 城镇
上海 浦西 城镇
上海 浦西 乡村

结果

地区 北京 上海 城镇 乡村
西城 3 2 2 1
东城 2 2 1 1
浦东 0 0 2 1
浦西 0 0 1 1

以前都是使用游标处理,现在突然感觉应该可以使用sql直接写出来,请高手指点!

------解决方案--------------------
--行列互转
--1、行换列
if object_id('Class') is not null
drop table Class
Go
Create table Class(
[Student] nvarchar(2),
[Course] nvarchar(2),
[Score] int)
Insert Class
select N'张三',N'语文',78 union all
select N'张三',N'数学',87 union all
select N'张三',N'英语',82 union all
select N'张三',N'物理',90 union all
select N'李四',N'语文',65 union all
select N'李四',N'数学',77 union all
select N'李四',N'英语',65 union all
select N'李四',N'物理',85 
Go

--2000方法:
--动态:
declare @s nvarchar(4000)
set @s=''
Select @[email protected]+','+quotename([Course])+'=max(case when [Course]='
 
+quotename([Course],'''')+' then [Score] else 0 end)'
from 
Class group by[Course]
--select @s
exec('select [Student][email protected]+' from Class group by [Student]')
--生成静态:
select 
[Student],
[数学]=max(case when [Course]='数学' then [Score] else 0 end),
[物理]=max(case when [Course]='物理' then [Score] else 0 end),
[英语]=max(case when [Course]='英语' then [Score] else 0 end),
[语文]=max(case when [Course]='语文' then [Score] else 0 end) 
from 
Class 
group by [Student]
GO
--动态:

declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course]
select @s
exec('select * from Class pivot (max([Score]) for [Course] in([email protected]+'))b')

--生成静态:
select * 
from 
Class 
pivot 
(max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b

--生成格式:
/*
Student 数学 物理 英语 语文
------- ----------- ----------- ----------- -----------
李四 77 85 65 65
张三 87 90 82 78

(2 行受影响)
*/

go
--加上总成绩(学科平均分)

--2000方法:
--动态:

declare @s nvarchar(4000)
set @s=''
Select @[email protected]+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+'then [Score] else 0 end)'
from Class group by[Course]
exec('select [Student][email protected]+',[总成绩]=sum([Score]) from Class group by [Student]')--加多一列(学科平均分用avg([Score]))

生成动态:

select 
[Student],
[数学]=max(case when [Course]='数学' then [Score] else 0 end),
[物理]=max(case when [Course]='物理' then [Score] else 0 end),
[英语]=max(case when [Course]='英语' then [Score] else 0 end),
[语文]=max(case when [Course]='语文' then [Score] else 0 end),
[总成绩]=([Score]) --加多一列(学科平均分用avg([Score]))
from 
Class 
group by [Student]

go

--2005方法:

动态:

declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course] 
--isnull(@s+',','') [email protected]

exec('select [Student],[email protected]+',[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a 
pivot (max([Score]) for [Course] in([email protected]+'))b ')

--生成静态:

select 
[Student],[数学],[物理],[英语],[语文],[总成绩] 
from 
(select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a --平均分时用avg([Score])
pivot 
(max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b 

生成格式:

/*
Student 数学 物理 英语 语文 总成绩
------- ----------- ----------- ----------- ----------- -----------
  相关解决方案