Я не пытаюсь удалить нулевые значения из таблицы, поэтому это не дубликат ссылки [https://stackoverflow.com/questions/53205266/sql-server-concatenate-ignore-null-value][1]
Как я могу получить результат, например таблицу OUTPUT, для запроса из исходной таблицы?
Я хочу установить значения столбцов в алфавитном порядке и объединить их как новое значение столбца.
Исходная таблица:
clsID stdID c1 c2 c3
---------------------------------------
cls1 10 HE HQ UA
cls1 11 HQ H1 UA
cls2 20 HG AB NULL
cls2 21 H2 HQ UA
cls2 22 NULL HQ UA
cls3 30 HG AB NULL
cls3 31 HQ GH UA
cls3 32 NULL HQ UA
cls3 33 NULL null null
В выводе мне нужно объединить столбцы stdId, c1, c2, c3, c4
и сохранить новое значение как новый столбец concatenatedvalue
.
Итоговая таблица:
clsID concatenatedvalue stdID c1 c2 c3
-----------------------------------------------------------
cls1 10-HE-HQ-UA 10 HE HQ UA
cls1 11-H1-HQ-UA 11 HQ H1 UA
cls2 20-AB-HG 20 HG AB NULL
cls2 21-H2-HQ-UA 21 H2 HQ UA
cls2 22-HQ-UA 22 NULL HQ UA
cls3 30-AB-HG 30 HG AB NULL
cls3 31-GH-HQ-UA 31 HQ GH UA
cls3 32-HQ-UA 32 NULL HQ UA
cls3 33 33 NULL null null
И покажите нам вашу текущую попытку запроса.
Также было бы лучше иметь образец строки, в которой значение C4 не равно нулю. В противном случае, зачем вообще иметь колонку C4?
@Isolated Я удалил столбец c4
Я голосую за возобновление вопроса, потому что вы также просите об объединении по алфавиту.
@AdrianKlaver Я отметил правильную категорию аудитории
@jarlh Я новичок в SQL, я пробовал метод сводной таблицы, методы объединения, но они не дали мне ожидаемых результатов. Так что я как бы застрял, как мне добиться выполнения этого требования. заранее спасибо.
@SoftwareEnginner ppsssssst: забавный факт: никогда не бывает причин использовать PIVOT
, никогда.
Поскольку вам нужно, чтобы объединенное значение было расположено в алфавитном порядке, это поможет сначала развернуть ваши данные, а затем string_agg()
собрать их вместе.
WITH unioncte (
SELECT clsid, stdid, c1 as col from table
union
SELECT clsid, stdid, c2 from table
union
SELECT clsID, stdID, c3 from table
)
SELECT unioncte.clsid,
CONCAT(stdID, STRING_AGG(col, '-') WITHIN GROUP (ORDER BY col) as concatinatedvalue,
unioncte.stdid,
t1.c1,
t1.c2,
t1.c3
FROM unioncte
INNER JOIN table as t1
ON unioncte.clsid = t1.clsid
AND unioncte.stdid = t1.stdid
GROUP BY clsid, stdid, c1, c2, c3
В этом решении используется функция UNPIVOT
внутри CTE. Остальное аналогично, а также использование string_agg
и within group
для упорядочивания значений.
with cte as (
select clsID, stdID, cols, vals
from (
select clsID, stdID, c1, c2, c3
from tableA
) a
unpivot
(vals for cols in (c1, c2, c3)
) as unpvt
)
select
a.clsID,
case
when a.c1 is null and a.c2 is null and a.c3 is null then cast(a.stdID as varchar)
else concat(a.stdID, '-', string_agg(c.vals, '-') within group (order by c.vals))
end as concat_value,
a.stdID, a.c1, a.c2, a.c3
from tableA a
left join cte c
on a.clsID = c.clsID
and a.stdID = c.stdID
group by a.clsID, a.stdID, a.c1, a.c2, a.c3
order by 1,3
НЕ отмечайте спам. Выберите один тег базы данных.