2016-09-26 42 views
0

讓我們假設我有那些2個表:SQL Server的多行組由

ID Time UserId 
1 08:00 55 
2 08:00 22 
3 08:00 04 
4 09:00 17 
5 11:00 11 
...etc... 

UserId Name 
01  Brian 
02  Francis 
03  David 
...etc... 

我想結果是:

Hours(distinct) Name 
08:00    Franck,Michelle,Damian 
09:00    Indiana, Robert 

事實上,我希望所有的不同的時間在上市第一列和列出的所有用戶名稱作爲一行。我想這個查詢:

選擇不同的轉換(VARCHAR(25),時間,120),測試= STUFF(( SELECT '' +名字從T2 WHERE T1.UserId = T2.Id FOR XML PATH (「」)), 1,1,「」)FROM T1組按時間

查詢作品,未經組通過,但它引發的錯誤與它「列‘用戶ID’是在選擇列表中無效因爲它不包含在聚合函數或GROUP BY子句中。「

有什麼想法?

+0

查詢擺脫'group BY Time'部分。 – gofr1

+0

如果我擺脫了羣組,我只是得到了每一行的單一名稱... –

回答

1

XML匯聚只能依賴於GROUP BY,time列出的列在你的情況

SELECT distinct convert (varchar(25),Time ,120) 
,test = STUFF (( 
    SELECT ',' + Name 
    FROM T2 
    WHERE T2.UserId IN (
     SELECT T3.UserID 
     FROM T1 AS T3 
     WHERE T3.time=T0.time) 
    FOR XML PATH('')), 1,1,'') 
FROM T1 as T0 
GROUP BY Time 
+1

NEER打敗你,但你的解決方案和他一樣順利。非常感謝:m)。 –

2

試試這個

SELECT DISTINCT 
    T.Time 
    STUFF(
     (SELECT 
      ',' + T2.Name 
     FROM 
      Table1 T1 INNER JOIN 
      Table2 T2 ON T1.UserId = T2.UserId 
     WHERE 
      T1.Time = T.Time 
     FOR XML PATH('') 
    ), 1, 1, '') A 
FROM 
    Table1 T 
+1

感謝兄弟,它的作品像一個魅力:) –

0

你可以嘗試這樣的

;WITH cte 
AS (SELECT 
    t1.time, t1.userid, t2.name 
FROM tab1 t1 
JOIN tab2 t2 
    ON t1.userid = t2.userid) 
SELECT 
    c.time, 
    (STUFF((SELECT ',' + d.name 
    FROM cte d 
    WHERE c.time = d.time 
    FOR xml PATH ('')), 1, 1, '')) AS Test 
FROM cte c 
GROUP BY c.time