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

查询难产了,该怎么解决

2013-02-18 
查询难产了typenameareaname------------ ------------------------白班黄泥磅区李1白班黄泥磅区李2晚班渝

查询难产了

typename         area       name
------------ ------------------------
白班           黄泥磅区         李1
白班           黄泥磅区         李2
晚班           渝北区          李3
白班           沙坪坝区         员工1
白班           渝北区          员工2
想转换成
typename    黄泥磅区         沙坪坝区     渝北区
---------- ---------------------------
白班         李2           员工1         员工2
白班         李2
晚班                                          李3

area不确定个数


[解决办法]

USE test
GO


-->生成表tb

if object_id('tb') is not null 
drop table tb
Go
Create table tb([typename] nvarchar(2),[area] nvarchar(4),[name] nvarchar(3))
Insert into tb
Select N'白班',N'黄泥磅区',N'李1'
Union all Select N'白班',N'黄泥磅区',N'李2'
Union all Select N'晚班',N'渝北区',N'李3'
Union all Select N'白班',N'沙坪坝区',N'员工1'
Union all Select N'白班',N'渝北区',N'员工2'


DECLARE @sql NVARCHAR(MAX)


SELECT 
@sql=ISNULL(@sql+',','')+'MAX(CASE WHEN area=N'''+area+''' THEN name ELSE '''' END) AS ['+area+']' 
FROM tb GROUP BY area
ORDER BY GetDate()


EXEC ('
SELECT 
typename
,'+@sql+'
FROM (
SELECT ROW_NUMBER()OVER(PARTITION BY typename,area ORDER BY name) AS row,* FROM tb
) AS t
GROUP BY row,typename
')

/*
typename 沙坪坝区 渝北区  黄泥磅区
-------- ---- ---- ----
白班       员工1  员工2  李1
白班李2
晚班            李3   
*/

热点排行