Как объединить несколько значений из нескольких столбцов в одну строку? - PullRequest
0 голосов
/ 13 октября 2018

У меня есть эта таблица:

image

Мне нужно преобразовать ее в (также с круглыми скобками):

row_nbr - row_label                     - default_order
10      - TOTAL ACCOUNTABLE GROSS       - (1, 3)
12      - DEDUCTIBLE TERMS              - (3)
20      - TOTAL DEDUCTIBLE TERMS        - (3)
34      - AMOUNT DUE (UNRECOUPED)       - (4)
36      - ACCOUNTABLE GROSS             - (2)
41      - TOTAL CONTINGENT COMPENSATION - (3)

Я мог бы иметь больше, чемдважды одного и того же row_nbr.

В этом случае число 10 есть дважды, но я мог бы иметь 3 10, 4 12 и т. Д.

Я вроде начал сводную таблицу, но, честно говоря, даже глядя на сайт MicrosoftЯ не могу за всю жизнь понять это.

select row_nbr, row_label, default_order
from #temp
pivot
(
  max(row_nbr)
  for default_order in (default_order)
) piv;

Кто-нибудь хочет помочь?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

ПИВОТЫ определенно шокируют, чтобы получить контроль.К счастью, в этом случае, хотя вы могли бы использовать один в качестве промежуточного шага, в этом нет необходимости.PIVOT возьмет каждое значение и поместит его в соответствующий отдельный столбец, а вам нужен только один столбец, объединяющий их все вместе.Как я уже сказал, вы могли бы сделать сводку, а затем просто объединить все сгенерированные столбцы вместе, но это намного больше работы, чем необходимо.

В 2014 году самый простой способ сделать этоиспользуя FOR XML.Ответ Рассела Фокса в значительной степени описывает, как работает эта техника (хотя есть несколько вариантов того, как вы можете сделать это, если захотите).

Если вы точно знаете, что все значения являются целыми числами, вы можете немного сэкономить.введите и пропустите операторы type и value, так как они необходимы, только когда вам нужно экранировать определенные символы XML в строковых полях

select
    row_nbr,
    row_label,
    default_order,
    stuff
    (
        (
            select concat(',', default_order)
            from #temp i
            where i.row_nbr = o.row_nbr
            for xml path('')
        ), 1, 1, '' 
    )

from #temp o
0 голосов
/ 13 октября 2018

Как говорит @Vinit, вы можете использовать функцию string_agg в 2017 году, но если вы хотя бы в 2005 году, вы можете использовать ужасный, мучительный XML-генератор:

SELECT  row_nbr
       ,row_label
       ,default_order = '(' +
            STUFF( 
            (SELECT ', ' + CAST(default_order AS VARCHAR(10))
            FROM        #temp
            WHERE       row_nbr = t.row_nbr
            ORDER BY    default_order
            FOR XML PATH('') ,
                ROOT('MyString'),
                TYPE ).value('/MyString[1]', 'varchar(max)'), 1, 2, '')
            + ')'
FROM    #temp t;

Вы можете прочитать больше оэто в этом блоге

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...