2016-09-26 41 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