STRING_AGG с отдельным без подзапроса - PullRequest
1 голос
/ 28 мая 2020

Это мои данные

Code    SubCode    Colour     Fruit     Car     City     Name
A       A1         Red        Apple     Honda   Mel      John
A       A1         Green      Apple     Toyota  NYC      John
A       A1         Red        Banana    Honda   Lon      John
A       A1         Red        Banana    Opel    Mel      John
A       A2         ...
A       A2         ...
A       A3
A       A3

Это мои sql

SELECT Code, SubCode, STRING_AGG(Colour, ',') STRING_AGG(Fruit, ',') STRING_AGG(Car, ',') STRING_AGG(City, ',') STRING_AGG(Name, ',')
FROM myTable

Я получаю эти результаты

Code    SubCode    Colour              Fruit                       Car                      City     Name
A       A1         Red,Green,Red,Red   Apple,Apple,Banana,Banan    Honda,Toyota,Honda,Opel  ...

Есть ли способ получить значения, выделенные в

Для одного значения я могу создать подзапрос STRING_AGG?

Code    SubCode    Colour      Fruit           Car                   City     Name
A       A1         Red,Green   Apple,Banana    Honda,Toyota,Opel     ...

Ответы [ 2 ]

5 голосов
/ 28 мая 2020

Увы, SQL Сервер string_agg() в настоящее время не поддерживает DISTINCT. Таким образом, вам потребуется несколько подзапросов, например:

select 
    code, 
    subcode, 
    (select string_agg(color, ',') from (select distinct color from mytable  t1 where t1.code = t.code and t1.subcode = t.subcode) t) colors,
    (select string_agg(fruit, ',') from (select distinct fruit from mytable  t1 where t1.code = t.code and t1.subcode = t.subcode) t) fruits,
    (select string_agg(car  , ',') from (select distinct car   from mytable  t1 where t1.code = t.code and t1.subcode = t.subcode) t) cars,
    (select string_agg(city , ',') from (select distinct city  from mytable  t1 where t1.code = t.code and t1.subcode = t.subcode) t) cities,
    (select string_agg(name , ',') from (select distinct name  from mytable  t1 where t1.code = t.code and t1.subcode = t.subcode) t) names
from mytable t
group by code, subcode

Обратите внимание, что в исходном запросе отсутствовало предложение group by, из-за чего он был недопустимым SQL. Я это тоже исправил.

2 голосов
/ 28 мая 2020

К сожалению, string_agg() не поддерживает distinct. Тем не менее, это легко эмулировать, используя row_number():

SELECT Code, SubCode,
       STRING_AGG(CASE WHEN seqnum_colour = 1 THEN Colour END, ','),
       STRING_AGG(CASE WHEN seqnum_fruit= 1 THEN Fruit END, ','),
       STRING_AGG(CASE WHEN seqnum_car = 1 THEN Car END, ','),
       STRING_AGG(CASE WHEN seqnum_city = 1 THEN City END, ','),
       STRING_AGG(CASE WHEN seqnum_name = 1 THEN Name END, ',')
FROM (SELECT t.*,
             ROW_NUMBER() OVER (PARTITION BY Code, SubCode, Colour ORDER BY Code) as seqnum_colour,
             ROW_NUMBER() OVER (PARTITION BY Code, SubCode, Fruit ORDER BY Code) as seqnum_fruit,
             ROW_NUMBER() OVER (PARTITION BY Code, SubCode, Car ORDER BY Code) as seqnum_car,
             ROW_NUMBER() OVER (PARTITION BY Code, SubCode, City ORDER BY Code) as seqnum_city,
             ROW_NUMBER() OVER (PARTITION BY Code, SubCode, Name ORDER BY Code) as seqnum_name
      FROM myTable t
     ) t
GROUP BY code, subcode;

Здесь - скрипт db <>.

...