2016-09-26 3 views
0

Давайте предположим, что я получил эти 2 таблицы:SQl сервера несколько строк группы по

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 

На самом деле, я хочу, чтобы все отдельные часы, которые будут перечислены в первый столбец и все имена пользователей, перечисленных как одна строка. Я попробовал этот запрос:

SELECT DISTINCT CONVERT (VARCHAR (25), время, 120), тест = STUFF (( SELECT '' + название от T2 WHERE T1.UserId = T2.Id FOR XML PATH («»)), 1,1 «») FROM группы Т1 по времени

запрос работает без группы по но вызовет ошибку с этим "Колонка„UserId“недопустим в списке выбора потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY ».

Любая идея?

+0

Избавиться части 'group BY Time'. – gofr1

+0

Если я избавлюсь от группы, я просто получил одно имя для каждой строки ... –

ответ

1

должно зависеть только от столбцов, перечисленных в 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 побьет вас, но ваше решение так же гладко, как и он. Большое спасибо: м). –

2

Попробуйте агрегацию XML

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