- 爱易网页
-
MSSQL教程
- 这条行列转换的SQL语句该如何写?
日期:2014-05-18 浏览次数:20757 次
这条行列转换的SQL语句该怎么写?急~~
在一个视图v_basevoyage中有这样的字段:
select portfuname,tt from v_basevoyage
services portfuname tt
c1 HongKong 0
c1 他科马 12
c1 奥克兰 15
c1 檀香山 20
c1 关岛 30
c2 盐田 12
c2 顺 4
怎样得到:
services days 他科马 奥克兰 檀香山 关岛
c1 HongKong 12 15 20 30
我写了N次了,老是说字段名无效,贵请各位大哥帮忙.
------解决方案--------------------
Select
services,
Max(Case portfuname When 'HongKong ' Then tt Else 0 End) As HongKong,
Max(Case portfuname When '他科马 ' Then tt Else 0 End) As 他科马,
Max(Case portfuname When '奥克兰 ' Then tt Else 0 End) As 奥克兰,
Max(Case portfuname When '檀香山 ' Then tt Else 0 End) As 檀香山,
Max(Case portfuname When '关岛 ' Then tt Else 0 End) As 关岛
From
v_basevoyage
Where
services = 'c1 '
Group By
services
------解决方案--------------------
create table v_basevoyage(services varchar(20),portfuname varchar(20),tt int)
insert into v_basevoyage select 'c1 ', 'HongKong ',0
union select 'c1 ', '他科马 ',12
union select 'c1 ', '奥克兰 ',5
union select 'c1 ', '檀香山 ',20
union select 'c1 ', '关岛 ',30
union select 'c2 ', '盐田 ',12
union select 'c2 ', '顺 ',4
go
create procedure q
@s varchar(20)---服务线路名称
as
begin
declare @sql varchar(4000)--查询语句
declare @port varchar(20)
set @sql=N 'select services, '
select @port=portfuname from v_basevoyage where services=@s and tt=0
if @port is null
return---没有始发港
set @sql=@sql+ ' ' ' '+@port+ ' ' ' days '
select TOP 100 Percent portfuname into #t from v_basevoyage where services=@s Group By portfuname,TT HAVING TT> 0 order by TT asc
select @sql=@sql +N ',sum(case portfuname when ' ' '+portfuname + ' ' ' then tt end )[ ' +portfuname + '] '
from #t
select @sql=@sql + N ' from v_basevoyage group by services HAVing services= ' ' '+@s+ ' ' ' '
exec (@sql)
drop table #t
end
go