我有3个表,它们是Events
,SignOffs
和Users
。
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
我对如何做到这一点没有任何想法,我甚至不确定如何简明扼要地阐明问题以便能够搜索答案。
答案 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
这可以在子查询中完成。
希望这有帮助。