Sql server 不带summarzie的行标题的列值
我有一张简单的单张桌子:Sql server 不带summarzie的行标题的列值,sql-server,tsql,rotation,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 A Group B Group
Group Name
------------------------------
Group A Marco
Group B Sven
Group A Adrian
Group B Tina
Group B Steffi
Group C Jil
Group C Bastian
要旋转就是这样。对于列组中的每个值
一个新列:
Group A Group B Group C
------------------------------
Adrian Steffi Bastian
Marco Sven Jil
Tina
列“组A
”、“组B
”和“组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
而且也没有分类
我怎样才能做到这一点?我需要你的帮助。这里的静态解决方案:(但要小心,在CTE中,a组必须具有最大名称数:) (如果您想要更具动态性的内容,请编写…) 好的,你也可以使用这个:根据你的请求编辑(但只针对3组…)
欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
{}
),以精确地格式化和语法突出显示它!选择(当t.group='group A'然后是t.user\U name END)[GruppeA],(当t.group='group B'然后是t.user\U name END)[GruppeB],(当t.group='group C'然后是t.user\U name END)[GruppeC]从[dbo]中选择(当t.group='GruppeC'然后是t.user\U name END)[GruppeC]。。组tHi!非常感谢!现在,我只需要动态地进行设置,并注意检测到组的名称数最大:-)
;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'
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