如何让SQL将列附加到结果集而不是添加更多行?

时间:2016-10-19 19:31:54

标签: sql sql-server pivot

我有3个表,它们是EventsSignOffsUsers

Events包含字段EventId(PK,int,autoincrement)和EventTitle(nvarchar(50))。

SignOffs包含字段SignOffId(PK,int,autoincrement),EventId(FK到Events.EventId)和SignedOffByUserId(FK到Users.UserId)。

Users包含字段UserId(PK,int,autoincrement)和UserName(nvarchar(50))。

我想做这样的事情:

SELECT [Events].EventId, EventTitle, UserName
FROM [Events]
     INNER JOIN [SignOffs] ON [Events].EventId = [SignOffs].EventId
     INNER JOIN [Users] ON [SignOffs].SignedOffByUserId = [Users].UserId

上述问题是,每个签名的人都会获得一行,因此如果有多人签名,可以多次在列表中重复给定的事件。

我想要的是将列添加到每个签署了事件的人的结果集中。因此,对于3人签约的事件,结果集应如下所示:

EventId - EventTitle - SignedOffByUser1 - SignedOffByUser2 - SignedOffByUser3

我对如何做到这一点没有任何想法,我甚至不确定如何简明扼要地阐明问题以便能够搜索答案。

1 个答案:

答案 0 :(得分:0)

您需要转动数据,这可以使用PIVOT运算符完成。 https://msdn.microsoft.com/en-us/library/ms177410.aspx?f=255&MSPPError=-2147217396

或者你可以使用多个case语句来达到同样的效果。

这两种方法的局限性在于您可能只有预定义数量的列。因此,如果您有超过3个签收,例如您将看不到它们。

另一种可能性是将它们放入csv列表中,无论有多少,都可以让它们在一行中看到它们。

http://blog.sqlauthority.com/2009/11/25/sql-server-comma-separated-values-csv-from-table-column/

SELECT SUBSTRING(
(SELECT ',' + s.Name
FROM HumanResources.Shift s
ORDER BY s.Name
FOR XML PATH('')),2,200000) AS CSV

这可以在子查询中完成。

希望这有帮助。