SQL动态 行转列解决思路

SQL动态 行转列
数据库查询的数据结果如下:SQL动态 行转列解决思路

要求显示如下样子:
SQL动态 行转列解决思路

动态显示行转列,sql 2008 数据。


在数据库,或者是代码里转都可以的,先谢谢各位了!
SQL动态 行转列  

------解决方案--------------------
http://bbs.csdn.net/topics/240002706
------解决方案--------------------
你这个和之前我的那个公司里的需要很相似,你只要动态生成一个语句就可以了
------解决方案--------------------
数据图片截图不好弄,有没有文本形式的数据

------解决方案--------------------
IF OBJECT_ID('tempdb..#Test','U') IS NOT NULL DROP TABLE #Test
CREATE TABLE #Test
(
ID CHAR(6)
,Name NVARCHAR(40)
,SubName NVARCHAR(40)
,YearONYear DECIMAL(9,2)
,LastYearScore DECIMAL(9,2)
,Score DECIMAL(9,2)
,TotalScore DECIMAL(9,2)
)
INSERT INTO #Test
SELECT 'M99101', N'M乌鲁木齐五一路店', NULL, NULL, NULL ,NULL, NULL UNION ALL
SELECT 'M89801', N'M三亚大东海鹿回头广场店(N9)', NULL, NULL, NULL, NULL, NULL   UNION ALL
SELECT 'M87102', N'M昆明环城南路双龙店', NULL, NULL, NULL, NULL, NULL UNION ALL
SELECT 'M87101', N'M昆明世博店', NULL, NULL, NULL, NULL, NULL UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'安全管理专项', NULL, NULL ,100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'案例八:服务意识', NULL, NULL, 0, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'案例二:入住接待', NULL ,NULL, 62.79, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'案例六:叫醒服务', NULL, NULL, 30, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'案例七:礼仪行为', NULL, NULL, 100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'案例三:离店结帐', NULL ,NULL, 59.26, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'案例四:早餐服务', NULL, NULL, 63.64, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'案例五:借用物品', NULL, NULL, 0, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'案例一:电话预订', NULL, NULL, 42.11, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'餐厅家具及物品', NULL, NULL, 100 ,85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'餐厅家具及物品(清洁)', NULL, NULL, 100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'大堂设施设备', NULL, NULL ,100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'大堂设施设备(清洁)', NULL, NULL, 100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'大堂用品和装饰', NULL, NULL, 100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'大堂用品和装饰(清洁)', NULL, NULL, 100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'地面、墙面和顶面(餐厅)', NULL, NULL, 100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'地面、墙面和顶面(餐厅清洁)', NULL ,NULL, 100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'地面、墙面和顶面(大堂)', NULL, NULL, 100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'地面、墙面和顶面(大堂清洁)', NULL, NULL, 100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'地面、墙面和顶面(公区)', NULL, NULL, 100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'地面、墙面和顶面(公区清洁)', NULL, NULL, 100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'地面、墙面和顶面(客房)', NULL, NULL, 100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'地面、墙面和顶面(客房清洁)', NULL, NULL, 100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'电梯', NULL ,NULL, 100, 85.31 UNION ALL
SELECT 'M85102', N'M贵阳解放路店', N'电梯(清洁)', NULL, NULL, 100, 85.31 


IF OBJECT_ID('tempdb..#ColumnNames','U') IS NOT NULL DROP TABLE #ColumnNames
CREATE TABLE #ColumnNames
(
ColumnName CHAR(4)
,Name NVARCHAR(40)
)
INSERT INTO #ColumnNames
SELECT CAST(ROW_NUMBER() OVER(ORDER BY GETDATE()) AS VARCHAR) AS ColumnID
,SubName
FROM #Test

DECLARE @SqlA NVARCHAR(MAX),@SqlB NVARCHAR(MAX),@SqlC NVARCHAR(MAX),@SqlD NVARCHAR(MAX)

SELECT @SqlA=ISNULL(@SqlA+',','')+'['+'LastYearScore'+ColumnName+']' FROM #ColumnNames
SELECT @SqlB=ISNULL(@SqlB+',','')+'['+'Score'+ColumnName+']' FROM #ColumnNames
SELECT @SqlC=ISNULL(@SqlC+',','')+'['+'YearONYear'+ColumnName+']' FROM #ColumnNames