sql-server - 在不知道整个值列表的情况下对列进行旋转

标签 sql-server sql-server-2005 tsql sql-server-2008

我有一张 table

Title            Name             Type
------------------------------------------------
T1               A                Primary
T1               B                Primary
T2               B                Primary
T2               C                Secondary
T2               D                Secondary

我需要输出

Title            Primary          Secondary
------------------------------------------------
T1               A, B             NULL/Blank
T2               B                C, D

原始表中的[Name]列可以具有任何值。即稍后可能有 E、F、G 等。

如何做到这一点?

最佳答案

那么你需要动态SQL。考虑这样的事情来生成列列表:

DECLARE @collist nvarchar(max);
SELECT @collist = STUFF((SELECT ', ' + quotename(Type) FROM YourTable GROUP BY Type FOR XML PATH('')), 1, 2, '');

现在您可以使用 @collist 帮助构建所需的查询,然后使用 sp_executesql 运行该查询

像这样:

DECLARE @collist nvarchar(max);
SELECT @collist = STUFF((SELECT ', ' + quotename(Type) FROM YourTable GROUP BY Type FOR XML PATH('')), 1, 2, '');

DECLARE @qry nvarchar(max);
SET @qry = N'
SELECT Title, ' + @collist + '
FROM 
(
    SELECT t.Title, t.Type, (SELECT STUFF((SELECT '', ''  + t2.Name FROM YourTable t2 WHERE t2.Title = t.Title AND t2.Type = t.Type ORDER BY t2.Name FOR XML PATH('''')),1,2,'''')) AS Names
    FROM YourTable t
    GROUP BY t.Type, t.Title
) tg
pivot (max(Names) for tg.Type in (' + @collist + ')) p
';
exec sp_executesql @qry;

关于sql-server - 在不知道整个值列表的情况下对列进行旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2421721/

相关文章:

sql - 在可安排培训师的定义空间内查找连续日期

sql-server - 按包含最多列的行过滤 SELECT 语句

sql-server - SQL Server : why is the 15th char of a GUID always 4?

c# - ADO.NET 中的连接异常

sql-server - 我的 SSIS 包有效,但作为 SSMS 作业失败(错误 : 0xC0016016)

sql-server - 删除存储过程中两个不同单词的第一个实例的最简单方法

将两个或多个表作为输出的 SQL JOIN - 最有效的方法?

sql-server - SQL Server - 查找服务器上所有数据库的用户/登录名的所有权限/访问权限

sql-server-2005 - 在 SQL Server 2005 中的 View 上创建全文索引

SQL SUM、CASE 和 DISTINCT