Запрос на создание нового столбца данных с объединением данных в алфавитном порядке

Я не пытаюсь удалить нулевые значения из таблицы, поэтому это не дубликат ссылки [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    

НЕ отмечайте спам. Выберите один тег базы данных.

Adrian Klaver 11.06.2024 19:33

И покажите нам вашу текущую попытку запроса.

jarlh 11.06.2024 19:43

Также было бы лучше иметь образец строки, в которой значение C4 не равно нулю. В противном случае, зачем вообще иметь колонку C4?

Isolated 11.06.2024 20:03

@Isolated Я удалил столбец c4

Software Enginner 11.06.2024 20:14

Я голосую за возобновление вопроса, потому что вы также просите об объединении по алфавиту.

Isolated 11.06.2024 20:30

@AdrianKlaver Я отметил правильную категорию аудитории

Software Enginner 11.06.2024 20:31

@jarlh Я новичок в SQL, я пробовал метод сводной таблицы, методы объединения, но они не дали мне ожидаемых результатов. Так что я как бы застрял, как мне добиться выполнения этого требования. заранее спасибо.

Software Enginner 11.06.2024 20:32

@SoftwareEnginner ppsssssst: забавный факт: никогда не бывает причин использовать PIVOT, никогда.

Dai 11.06.2024 20:40
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
8
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поскольку вам нужно, чтобы объединенное значение было расположено в алфавитном порядке, это поможет сначала развернуть ваши данные, а затем 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
clsID concat_value стандартный идентификатор с1 с2 с3 cls1 10-HE-HQ-UA 10 ОН штаб-квартира UA cls1 11-H1-HQ-UA 11 штаб-квартира H1 UA cls2 20-АБ-ХГ 20 ХГ АБ нулевой cls2 21-H2-HQ-UA 21 Н2 штаб-квартира UA cls2 22-HQ-UA 22 нулевой штаб-квартира UA cls3 30-АБ-ХГ 30 ХГ АБ нулевой cls3 31-GH-HQ-UA 31 штаб-квартира ГХ UA cls3 32-HQ-UA 32 нулевой штаб-квартира UA cls3 33 33 нулевой нулевой нулевой

рабочий пример

Другие вопросы по теме