我有这个简单的单表:
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
它也没有排序。
我怎样才能做到这一点?我需要你的帮助。
答案 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