2015-02-19 1 views
1

См. Следующий код SQL.Как группировать таблицу, сохраняя при этом все значения столбцов в каждой группе в один столбец как значения, разделенные запятыми

Declare @LookUp table (id int,val varchar(12)) 
insert into @LookUp values (1,'A'),(1,'D'),(1,'X'),(2,'B'),(2,'F') 

Declare @summary table (id int,val varchar(2000)) 
------------------------------ 
Declare @value varchar(30) 
Declare @start int = 1, @end int = (Select count(Distinct id) from @LookUp) 

While @start <= @end 
Begin 
    Set @value = '' 
    Select @value = @value + '|' + val From @LookUp Where id = @start 

    Insert into @summary 
    Select @start,Right(@value,Len(@value)-1) 

    Set @start = @start + 1 
End 

Select * From @summary 

с помощью следующего запроса, я группировка на основе кода, и сделать значения с в группе, в качестве значений, разделенных запятой.

Вход:

enter image description here

Выход:

enter image description here

Я сделал это с помощью цикла, который не выполняет очень хорошо, когда речь идет о большом количестве данных.

Можем ли мы сделать это, избегая петли?

Примечание: Предположим, что @ lookup.id является непрерывным.

+1

Возможный дубликат [Как использовать GROUP BY для конкатенации строк в SQL Server?] (Http://stackoverflow.com/questions/273238/how-to-use-group-by-to-concatenate-strings- in-sql-server) – jpw

ответ

2
INSERT @summary(id, val) 
SELECT 
    t.id, 
    STUFF(( 
     select '|' + [val] 
     from @LookUp t1 
     where t1.id = t.id 
     for xml path(''), type 
    ).value('.', 'varchar(max)'), 1, 1, '') [values] 
FROM @LookUp t 
GROUP BY t.id 
+0

привет, большое спасибо. Еще одна вещь. Если в DB2 нужно сделать одну и ту же логику, у нас есть аналогичные функции. –

+1

@JithinShaji не знаю, попробуйте Google. Уверен, что эта проблема возникла раньше –

2

Попробуйте это ..

Declare @LookUp table (id int,val varchar(12)) 
    insert into @LookUp values (1,'A'),(1,'D'),(1,'X'),(2,'B'),(2,'F') 

    select 
     id, 
     val = 
      stuff((
       select 
        '| ' + t2.val 
       from @LookUp t2 
       where 
        t2.id = t1.id 
       group by t2.val 
       for xml path(''), type).value('.', 'varchar(max)' 
      ), 1, 2, '') 
    from @LookUp t1 
    GROUP BY t1.id 
+0

привет, большое спасибо. Еще одна вещь. Если в DB2 нужна такая же логика, у нас есть аналогичные функции. –

2
Declare @LookUp table (id int,val varchar(12)) 
insert into @LookUp values (1,'A'),(1,'D'),(1,'X'),(2,'B'),(2,'F'); 


WITH A AS 
(
    SELECT DISTINCT id 
    FROM @LookUp 
) 
SELECT 
    A.id, 
    STUFF 
    (
     (
      SELECT ',' + val 
      FROM @LookUp B 
      WHERE B.id = A.id 
      FOR XML PATH('') 
     ), 
     1, 1, '' 
    ) AS val 
FROM A 
2
Declare @LookUp table (id int,val varchar(12)) 
insert into @LookUp values (1,'A'),(1,'D'),(1,'X'),(2,'B'),(2,'F') 


SELECT DISTINCT a.id, stuff((select '|' + val 
         from @LookUp c 
         where c.id = a.id 
         for xml path('')),1,1,'') as vall 
FROM @LookUp a 
2

Я добавлю решение, основанное на рекурсивного общего табличного выражения. С небольшими изменениями она должна работать в DB2 тоже (вы должны изменить функцию row_number() к rownumber() и как конкатенация работает во втором списке (используйте || вместо функции concat)

DECLARE @LookUp TABLE (id int, val varchar(12)) 
INSERT INTO @LookUp VALUES (1,'A'),(1,'D'),(1,'X'),(2,'B'),(2,'F') 

;WITH 
    list1(rn, id, val) AS 
    ( 
     SELECT row_number() OVER (PARTITION BY id ORDER BY id), id, val 
     FROM @LookUp 
    ), 
    list2 (id, val, idx) AS 
    ( 
     SELECT id, val, 1 
     FROM list1 
     WHERE rn = 1 
     UNION ALL 
     SELECT 
     list2.id, 
     CAST(CONCAT(list2.val, ' | ', list1.val) AS varchar(12)), 
     list2.idx + 1 
     FROM list2 
    JOIN list1 ON list2.id = list1.id 
     WHERE list2.idx + 1 = list1.rn 
    ) 


SELECT l2.id, l2.val 
FROM list2 l2 
JOIN (SELECT id, MAX(rn) maxid FROM list1 GROUP BY id) a 
ON l2.id = a.id AND l2.idx = a.maxid 
ORDER BY l2.id 

Воспроизводит:.

id val 
1 A | D | X 
2 B | F 
+0

Отлично .. помогите, спасибо –

+0

Что такое мнение о мнении о коэффициенте производительности. Мы ожидаем много данных, может составлять 10 миллионов. –

+0

@JithinShaji Я бы не ожидал, что производительность будет хорошей, так как рекурсия может быть дорогой, но попробуйте посмотреть, как она работает. В отличие от других решений, этот переносимый и не зависит от каких-либо функций, характерных для MS SQL Server. – jpw

Смежные вопросы