【发布时间】:2010-12-20 22:31:52
【问题描述】:
我有一个“事件”表,每个事件都有一个包含 1-4 个(本质上可变的#)“用户”的列表。因此,假设我获得了今天的所有事件,然后我想将用户列为动态列数,而不是重复的行。
我现在有
SELECT E.EventID, E.Time, U.Name FROM Events
INNER JOIN Users U ON E.UserID = U.UserID
WHERE Date = '12/20/2010'
这给我带来如下结果:
EventID, Time, Name
211, '4:00am', 'Joe'
211, '4:00am', 'Phil'
211, "4:00am', 'Billy'
218, '7:00am', 'Sally'
218, '7:00am', 'Susan'
我可以使用它并且这是可以接受的,但是 EventID 和 Time 的重复(我的实际查询中有更多列)对我来说似乎很浪费。我真正想要的输出是这样的:
EventID, Time, Name1, Name2, Name3
211, '4:00am', 'Joe', 'Phil', 'Billy'
218, '7:00am', 'Sally', 'Susan', NULL
我曾尝试查看 PIVOT 的教程(我有 SQL 2008),但我不知道它们在概念上是否符合我想要做的事情。他们中的大多数都使用“MIN”或“MAX”。
也许这不能完成?我的另一种选择是获取今天的事件列表,然后遍历该列表,找到该事件的用户记录集。不过,我更愿意在一个查询中获取所有内容。
有什么想法吗?
【问题讨论】:
-
你能改变表的架构吗?我将
EventID Time Name1 Name2 Name3存储在Events中,然后对每个用户拥有的eventID 进行简单的选择。用户可以有多个事件,而 eventID 就是外键。 -
让我想起了 MySQL 的 GROUP_CONCAT()。这个问题w.r.t。 MSSQL 帮助? stackoverflow.com/questions/273238/…
-
您可以将名称合并到一个单独的分隔列中。所以你会得到:EventID, Time, Names 211, '4:00am', "Joe,Phil,Billy"
-
我认为在 sql 中使用迭代函数来完成此操作是错误的方法,您将获得本应处理代码迭代的性能开销。除非用代码再次分隔(更不用说重复),否则您将无法按原样使用答案。