группировка элементов в SQL-запросе - PullRequest
1 голос
/ 06 января 2010

У меня есть таблица с такими столбцами (в SQL Server 2000)

MailCode   Mode   Name     Group
--------  -----  --------- -------
1          1      abc        0
1          1      def        0
1          1      qwe        1
2          2      aaw        0
2          2      aad        0

Я хочу сгруппировать поле Имя на основе остальных полей, чтобы результат выглядел следующим образом (должна быть только одна уникальная комбинация mailCode, Mode и group)

MailCode   Mode      Names            Group
---------   ------   ------------      -------
1           1        abc, def           0
1           1        qwe                1
2           2        aaw, aad           0

Как мне создать sql-запрос для этого?

Ответы [ 3 ]

1 голос
/ 06 января 2010

У меня была похожая проблема, когда мне приходилось конкатенировать поле в select, в то время моим решением было создать процедуру, которая возвращала бы результат и вызывала его так:

выберите x в качестве поля1, y в качестве поля2, dbo.procedure в качестве поля3

1 голос
/ 06 января 2010

Решение SQL Server 2000

К счастью, COALESCE поддерживается в 2000 , так что вы можете использовать трюк COALESCE для создания списка значений, разделенных запятыми, демонстрируется в этой ссылке . Из-за использования переменной вам нужно будет создать функцию / процедуру и вызвать ее в основном запросе. По сути, просто замените STUFF () в запросе ниже на вызов функции.

Решение SQL Server 2005+:

  SELECT x.mailcode,
         x.mode,
         STUFF((SELECT y.name
                  FROM TABLE y
                 WHERE y.mailcode = x.mailcode
                   AND y.mode = x.mode
                   AND y.gropu = x.group
              GROUP BY y.mailcode, y.mode, y.group
               FOR XML PATH(', ')), 1, 1, '') AS name,
         x.group
    FROM TABLE x
GROUP BY x.mailcode, x.mode, x.group
0 голосов
/ 06 января 2010

Я не могу придумать простой запрос, который даст желаемый результат, но некоторая логика в этом направлении должна привести вас туда, куда вы хотите:

1) Loop through distinct MailCode, Mode, Group Rows
  A) select all names in group
   A.1) Loop through names
   A.2) Concatenate them together into temp variable
  B) insert all data (MailCode, Mode, Group, temp variable) into temp table

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

...