【问题标题】:SQL Dynamic Column Query [duplicate]SQL 动态列查询 [重复]
【发布时间】:2010-12-20 22:31:52
【问题描述】:

可能重复:
Is there a way to create a SQL Server function to "join" multiple rows from a subquery into a single delimited field?

我有一个“事件”表,每个事件都有一个包含 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 中使用迭代函数来完成此操作是错误的方法,您将获得本应处理代码迭代的性能开销。除非用代码再次分隔(更不用说重复),否则您将无法按原样使用答案。

标签: sql dynamic


【解决方案1】:

返回可变数量的列在代码中会更难处理。您当前获得的结果集很容易转换为您可以在代码中使用的对象。

你想对输出做什么?

【讨论】:

  • 这正是我的想法。您可以使用动态 SQL 来执行此操作,但您愿意吗?
  • 嗯,只是可能会有……比如说 200-300 行在该查询中返回。这个页面将被称为很多,所以我想尽量减少我在每个查询中获取的数据量。
猜你喜欢
  • 2012-06-03
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 2018-01-21
  • 2015-09-24
相关资源
最近更新 更多