2010-12-20 108 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