#sql-server #pivot #case #aggregate-functions #string-agg
#sql-server #сводная #кейс #агрегатные функции #строка-agg
Вопрос:
Я пытаюсь выполнить сложный запрос агрегирования и конкатенации, чтобы подготовить данные для импорта на веб-сайт, объединяя несколько строк и столбцов результатов в одну строку для каждого идентификатора.
Я почти на месте, за исключением того, что я получаю много нулевых результатов, несмотря на отсутствие нулевых значений в исходных данных.
Исходные данные:
ID | значение_1 | значение_2 | значение_3 | Тип |
---|---|---|---|---|
x1 | sometext | othertext | подробнее | A2 |
x1 | sometext | othertext | подробнее | B1 |
x1 | sometext | othertext | подробнее | B2 |
x2 | sometext | othertext | подробнее | B1 |
x2 | sometext | othertext | подробнее | A2 |
x2 | sometext | othertext | подробнее | B1 |
Следующее:
select distinct id,
case when type='A2' then string_agg (concat(cast (value_1 as nvarchar (max)),value_1,value_2,value_3)) end as type_A2,
case when type='B1' then string_agg (concat(cast (value_1 as nvarchar (max)),value_1,value_2,value_3)) end as type_B1
from source
group by id, type
Выдает:
ID | тип_а2 | Тип_в1 |
---|---|---|
x1 | sometextothertextmoretext | NULL |
x1 | NULL | sometextothertextmoretext |
x2 | sometextothertextmoretext | NULL |
x2 | NULL | sometextothertextmoretext |
Когда я пытаюсь запускать только один столбец за раз, я все равно получаю некоторые нулевые результаты.
Как мне получить эти результаты в одну строку для каждого уникального идентификатора?
ie…
ID | тип_а2 | Тип_в1 |
---|---|---|
x1 | sometextothertextmoretext | sometextothertextmoretext |
x2 | sometextothertextmoretext | sometextothertextmoretext |
x3 | и т. д | и т. д |
Ответ №1:
Вам нужна одна строка для каждого id
— итак, я бы начал с удаления type
из select
group by
предложений and . Затем case
выражение будет помещено внутрь агрегатных функций. Итак:
select id,
string_agg(case when type = 'A2' then concat(cast(value_1 as nvarchar(max)), value_1, value_2, value_3) end, ',') as type_a2,
string_agg(case when type = 'B1' then concat(cast(value_1 as nvarchar(max)), value_1, value_2, value_3) end, ',') as type_b1
from mytable
group by id
Комментарии:
1. Это правильно, с одним небольшим изменением: разделительное предложение необходимо с помощью string_agg . т.е. string_agg(случай, когда type = ‘A2’ затем concat(приведение (value_1 как nvarchar(max)), value_1, value_2, value_3) end, [РАЗДЕЛИТЕЛЬ] ) как type_a2 Большое спасибо — это сводило меня с ума.
2. @smallnorthumbrianvillage: добро пожаловать. Я добавил отсутствующий разделитель в свой ответ.