2010-12-20 80 views
2

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

我有 “事件” 的表,每个事件都有1-4(主要是变量#)AA名单“用户”。假设我今天收到了所有事件,然后我想将用户列为动态列数,而不是重复行。

现在我有

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' 

我可以用这个工作,这是可以接受的,但是对于事件ID和时间的重复(有更多的列我的实际查询)对我来说似乎很浪费。我真的会在输出喜欢的是这样的:

EventID, Time, Name1, Name2, Name3 
211, '4:00am', 'Joe', 'Phil', 'Billy' 
218, '7:00am', 'Sally', 'Susan', NULL 

我试图寻找教程枢轴(我有SQL 2008),但我不知道他们是否匹配概念什么,我试图做。他们大多数使用“MIN”或“MAX”。

也许这不能做?我的另一种选择是获取今天的事件列表,然后循环查找该事件的用户记录集。我宁愿在一个查询中抓住它。

任何想法?

+0

你可以改变表的模式吗?我会在'Events'中存储'EventID Time Name1 Name2 Name3',然后在每个用户拥有的eventID上做一个简单的选择。用户可能有多个事件,而eventID则是外键。 – Robert 2010-12-20 22:37:37

+0

让我想起MySQL的GROUP_CONCAT()。这个问题w.r.t. MSSQL的帮助? http://stackoverflow.com/questions/273238/how-to-use-group-by-to-concatenate-strings-in-mssql – Riedsio 2010-12-20 22:38:26

+0

您可以将名称一起合并到单个分隔列中。所以你会得到: EventID,Time,Names 211,'4:00 am','Joe,Phil,Billy' – Adam 2010-12-20 22:46:19

回答

2

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

你想用输出做什么?

+0

这正是我的想法。你可以用动态SQL做到这一点,但你想吗? – 2010-12-20 22:42:09

+0

嗯,只是说有可能会有......说200-300行回来查询。这个页面将被称为LOT,所以我想尽量减少我在每个查询中抓取的数据量。 – MikeMurko 2010-12-20 22:47:12