Как преобразовать каждую строку в уникальный столбец - PullRequest
0 голосов
/ 16 мая 2019

Я использую SQL Server 2012 и хочу получить csv о проверке № и имени элемента для анализа рынка;

Текущий вывод данных;

Check No    Item Name
1010000001  3/4 Time Session Ale
1010000001  Aquilani Gls
1010000001  Australian Psycho 50L
1010000001  Bloody Mary
1010000001  Brookvale Ginger Beer
1010000001  Buffalo Trace
1010000001  Café Latte
1010000001  Cake Sparkling Gls
1010000001  Cap
1010000001  Capi Blood Orange
1010000001  Capi Dry Ginger
1010000002  Capi Pink Grapefruit
1010000002  Capi Soda
1010000002  Capi Sparkling Mineral
1010000002  Capi Yuzu
1010000002  Cappucino
1010000002  Carlton Draught
1010000002  Catalina Sounds Gls
1010000002  Chicken Taco
1010000002  Chivas Regal 12 Yr
1010000002  Coke
1010000002  Corona

Ожидаемый вывод;

1010000001 | 3/4 Time Session Ale | Aquilani Gls | Australian Psycho 50L etc

Я использовал следующий код:

SELECT [CheckNo], 
       Items = STUFF((SELECT ', ' + [itemModName1]
                      FROM tbl_item AS T1
                      WHERE T1.[CheckNo] = T2.[CheckNo]
                      FOR XML PATH(''), TYPE).value('.[1]', 'varchar(max)'), 1, 1, '')
FROM tbl_item AS T2
GROUP BY [CheckNo];

Results;

он дает мне все элементы в одном столбце, что бесполезно.

1 Ответ

0 голосов
/ 16 мая 2019

Во-первых, непонятно, что вы подразумеваете под «он дает мне все элементы в одном столбце, что не помогает».

После быстрой проверки вашего кода я вижу две проблемы.

  1. GROUP BY не должно быть там. Агрегация текста производится по XML PATH. Используя дополнительный GROUP BY, я ожидаю, что ваш запрос не должен работать, поскольку второй столбец не является функцией агрегирования.
  2. Вы используете ',' в качестве разделителя, который имеет длину 2, но вы удаляете только 1 символ в начале с STUFF, что приведет к пробелу в начале. Не страшная вещь, но все же.

Поэтому я рекомендую попробовать:

SELECT [CheckNo], 
       Items = STUFF((SELECT ', ' + [itemModName1]
                      FROM tbl_item AS T1
                      WHERE T1.[CheckNo] = T2.[CheckNo]
                      FOR XML PATH(''), TYPE).value('.[1]', 'varchar(max)'), 1, 2, '')
FROM tbl_item AS T2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...