Исключить нулевые результаты из запроса обращения — нет нулевых значений в источнике

#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: добро пожаловать. Я добавил отсутствующий разделитель в свой ответ.