首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求一处置竖行转换为横行的SQL语句

2012-12-14 
求一处理竖行转换为横行的SQL语句?日期站号实况20111005121.120111006121.220111007121.3 20111008121.420

求一处理竖行转换为横行的SQL语句?
日期        站号   实况         
20111005    1      21.1               
20111006    1      21.2  
20111007    1      21.3 
20111008    1      21.4  
20111009    1      21.5 
20111010    1      21.6             
20111005    2      23.1               
20111006    2      23.2              
20111007    2      23.3
20111008    2      23.4
20111009    2      23.5
20111010    2      23.6
.....

现想处理成这样的表,如何写SQL?

日期        站号   第1天实况   第2天实况    第3天实况   第4天实况   第5天实况   
20111005    1      21.1         21.2         21.3         21.4       21.5
20111006    1      21.2         21.3         21.4         21.5       21.6        
20111005    2      23.1         23.2         23.3         23.4       23.5              
20111006    2      23.2         23.3         23.4         23.5       23.6            
.....
[最优解释]
亮瞎你们得双眼,也不看看他要的什么结果,他要的结果根本实现不了


if (object_id('a') is not null) drop table a
go
create table a
(
date1 datetime,
stopNum int,
state decimal(18,1)
)
go
insert into a

select '20111005',1,21.1  union all
select '20111006',1,21.2   union all 
select '20111007',1,21.3    union all
select '20111008',1,21.4     union all
select '20111009',1,21.5    union all
select '20111010',1,21.6     union all
select '20111005',2,23.1     union all


select '20111006',2,23.2     union all
select '20111007',2,23.3  union all
select '20111008',2,23.4  union all
select '20111009',2,23.5  union all
select '20111010',2,23.6


--动态
declare @sql varchar(8000)

set @sql = ''
select @sql = @sql+','+'max(case  when [date1]= '+quotename('date1')+' then '+quotename('state')+' else 0 end) as ''第'+right(convert(varchar(10),date1,12),1)+'天实况'+'('+replace(convert(varchar(10),date1,121),'-','')+')''' from a group by date1

 

exec ('select stopNum '+@sql+' from a group by stopNum')
--静态
select stopNum ,max(case  when [date1]= [date1] then [state] else 0 end) as '第5天实况(20111005)',
                max(case  when [date1]= [date1] then [state] else 0 end) as '第6天实况(20111006)',
                max(case  when [date1]= [date1] then [state] else 0 end) as '第7天实况(20111007)',
                max(case  when [date1]= [date1] then [state] else 0 end) as '第8天实况(20111008)',
                max(case  when [date1]= [date1] then [state] else 0 end) as '第9天实况(20111009)',
                max(case  when [date1]= [date1] then [state] else 0 end) as '第0天实况(20111010)' 
from a group by stopNum

/*
stopNum     第5天实况(20111005)                         第6天实况(20111006)                         第7天实况(20111007)                         第8天实况(20111008)                         第9天实况(20111009)                         第0天实况(20111010)
----------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
1           21.6                                    21.6                                    21.6                                    21.6                                    21.6                                    21.6


2           23.6                                    23.6                                    23.6                                    23.6                                    23.6                                    23.6

(2 行受影响)

*/


[其他解释]
MAX(CASE WHEN .....

PIVOT
[其他解释]
一、列转行

1、建立表格

ifobject_id('tb')isnotnulldroptabletb

go

createtabletb(姓名varchar(10),课程varchar(10),分数int)

insertintotbvalues('张三','语文',74)

insertintotbvalues('张三','数学',83)

insertintotbvalues('张三','物理',93)

insertintotbvalues('李四','语文',74)

insertintotbvalues('李四','数学',84)

insertintotbvalues('李四','物理',94)

go

select*fromtb

go

姓名       课程       分数
---------- ---------- -----------

张三       语文        74

张三       数学        83

张三       物理        93

李四       语文        74

李四       数学        84

李四       物理        94

 

2、使用SQL Server 2000静态SQL

--c

select姓名,

 max(case课程when'语文'then分数else0end)语文,

 max(case课程when'数学'then分数else0end)数学,

 max(case课程when'物理'then分数else0end)物理

fromtb
groupby姓名

姓名       语文        数学        物理

---------- ----------- ----------- -----------

李四        74          84          94

张三        74          83          93

 

3、使用SQL Server 2000动态SQL

--SQL SERVER 2000动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)

--变量按sql语言顺序赋值

declare@sqlvarchar(500)

set@sql='select姓名'

select@sql=@sql+',max(case课程when '''+课程+''' then分数else 0 end)['+课程+']'


from(selectdistinct课程fromtb)a--同from tb group by课程,默认按课程名排序

set@sql=@sql+' from tb group by姓名'

exec(@sql)

 

--使用isnull(),变量先确定动态部分

declare@sqlvarchar(8000)

select@sql=isnull(@sql+',','')+' max(case课程when '''+课程+''' then分数else 0 end) ['+课程+']'

from(selectdistinct课程fromtb)asa      

set@sql='select姓名,'+@sql+' from tb group by姓名'

exec(@sql)
姓名       数学        物理        语文

---------- ----------- ----------- -----------

李四        84          94          74

张三        83          93          74

 

4、使用SQL Server 2005静态SQL

select*fromtb pivot(max(分数)for课程in(语文,数学,物理))a

 

5、使用SQL Server 2005动态SQL

--使用stuff()

declare@sqlvarchar(8000)

set@sql=''  --初始化变量@sql

select@sql=@sql+','+课程fromtbgroupby课程--变量多值赋值

set@sql=stuff(@sql,1,1,'')--去掉首个','

set@sql='select * from tb pivot (max(分数) for课程in ('+@sql+'))a'
exec(@sql)

 

--或使用isnull()

declare@sqlvarchar(8000)

–-获得课程集合

select@sql=isnull(@sql+',','')+课程fromtbgroupby课程           

set@sql='select * from tb pivot (max(分数) for课程in ('+@sql+'))a'

exec(@sql)


[其他解释]
如果是日期为 20111031 则第2天实况取20111101日的实况,第3天实况取20111102日的实况
[其他解释]
好多例子,学习
[其他解释]
请高手指教解答一下,日期处理方面对我来说还是有难度的,谢谢了!

热点排行
Bad Request.