列值没有summarzie的行标题

时间:2014-12-05 07:15:12

标签: sql-server tsql rotation

我有这个简单的单表:

 Group      Name      
------------------------------
 Group A    Marco
 Group B    Sven  
 Group A    Adrian
 Group B    Tina
 Group B    Steffi
 Group C    Jil
 Group C    Bastian

并希望以这种方式旋转。列Group中的每个值都有一个新列:

Group A      Group B      Group C
------------------------------
Adrian       Steffi       Bastian
Marco        Sven         Jil
             Tina

列“Group A”,“Group B”和“Group C”按字母顺序排序。

我通过“结束时的情况”尝试了它,但结果是这样的:

Group A      Group B      Group C
------------------------------
Marco        null         null
Adrian       null         null
null         Steffi       null
null         Sven         null
null         Tina         null
null         null         Jil
null         null         Bastian

它也没有排序。

我怎样才能做到这一点?我需要你的帮助。

1 个答案:

答案 0 :(得分:1)

这里的静态解决方案:(但要小心,在CTE中必须是具有最大名称数量的组:)) (如果你想动态更多,请写...)

;WITH CTE AS (SELECT ROW_NUMBER() OVER (partition by [Group] ORDER BY [Group]) AS RN,[Group], Name 
             FROM YourTable)


SELECT x.Name AS GroupA, a.Name AS GroupB, z.Name AS GroupC
FROM CTE a
OUTER APPLY(SELECT Name FROM CTE b WHERE a.RN = b.RN AND b.[Group] = 'Group A') x
OUTER APPLY(SELECT Name FROM CTE c WHERE a.RN = c.RN AND c.[Group] = 'Group C') z
WHERE a.[Group] = 'Group B'

好的你也可以使用这个:根据你的要求编辑(但它只适用于3组......)

DECLARE @param_group1 varchar(50),
        @param_group2 varchar(50),
        @param_group3 varchar(50)

SET @param_group1 = 
(SELECT TOP 1 [Group] 
FROM YourTable
GROUP BY [Group] 
ORDER BY COUNT([Group]) DESC)

SET @param_group2 = 
(SELECT TOP 1 [Group] 
FROM YourTable
WHERE [Group] NOT IN (@param_group1)
GROUP BY [Group] 
ORDER BY COUNT([Group]) DESC)

SET @param_group3 = 
(SELECT TOP 1 [Group] 
FROM YourTable
WHERE [Group] NOT IN (@param_group1, @param_group2)
GROUP BY [Group] 
ORDER BY COUNT([Group]) DESC)

DECLARE @cmd VARCHAR(MAX)

SET @cmd = '
WITH CTE AS (SELECT ROW_NUMBER() OVER (partition by [Group] ORDER BY [Group]) AS RN,[Group], Name 
             FROM YourTable)


SELECT x.Name AS ['+@param_group1+'], a.Name AS ['+@param_group2+'], z.Name AS ['+@param_group3+']
into ##tmp1
FROM CTE a
OUTER APPLY(SELECT Name FROM CTE b WHERE a.RN = b.RN AND b.[Group] = '''+@param_group2+''') x
OUTER APPLY(SELECT Name FROM CTE c WHERE a.RN = c.RN AND c.[Group] = '''+@param_group3+''') z
WHERE a.[Group] = '''+@param_group1+''''


IF OBJECT_ID('tempdb..##tmp1') IS NOT NULL DROP TABLE ##tmp1
EXEC (@cmd)

SELECT [Group A],[Group B],[Group C]
FROM ##tmp1