Как извлечь несколько столбцов в один столбец

Я очень стараюсь реализовать приведенные ниже требования, но я не понимаю, возможно ли это сделать с помощью сервера sql. Пожалуйста, предложите мне.

В приведенной ниже таблице для каждого идентификатора может быть 1 метка X, 2 метки X или 3 метки X в других столбцах, как показано в таблице ниже. Поэтому мне нужно написать запрос, чтобы получить новое имя столбца со всеми столбцами, помеченными X. Пожалуйста, обратитесь к образцу выходной таблицы.

Таблица 1

ИдентификаторТекущее количествоУровень рискаКороткое имяБез исключенийАВСDЭФГХIJKLМНОП
10101002Джон КрспнулевойИкснулевойнулевойнулевой
10112005Дэвид СкунулевойИкснулевойнулевойнулевой
10223001ПатрикнулевойИксИксИкснулевой

дб <> рабочий пример здесь

Желаемый результат:

ИдентификаторТекущее количествоУровень рискаКороткое имякод исключения
10101002Джон КрспАВСD
10112005Дэвид СкуАВСD
10223001ПатрикАВСD
10223001ПатрикЭФГХ
10223001ПатрикIJKL

Пожалуйста, публикуйте все запросы, образцы данных и ожидаемые результаты в виде текста, а НЕ в виде изображений. Мы не можем копировать текст со снимков экрана...

SOS 10.04.2022 04:34

Я не могу добавить образцы данных, они всегда принимают неправильный формат

user17824023 10.04.2022 04:45

Любой здесь может помочь, отредактировав вопрос позже, если форматирование отключено. Вы также можете создать скрипку и опубликовать SQL, используя sqlfiddle.com. Попробуйте параметр «Текст в DDL», который позволяет вставлять данные с разделителями и автоматически создавать из них DDL.

SOS 10.04.2022 04:49

Спасибо за ответ, я добавил образцы данных, пожалуйста, помогите мне, заранее спасибо

user17824023 10.04.2022 04:59

Пожалуйста, покажите свою попытку и объясните, где застрял.

Dale K 10.04.2022 07:34
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
6
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы можете попробовать использовать CROSS APPLY с VALUE

select t1.id,
       t1.CurrentAmount,
       t1.RiskRating,
       t1.ShortName,
       v.Expectioncode
from table1 t1 CROSS APPLY (
   VALUES (ABCD,'ABCD'),
   (EFGH,'EFGH'),
   (IJKL,'IJKL'),
   (MNOP,'MNOP')
) v (val,Expectioncode)
WHERE v.val IS NOT NULL

Редактировать

Из вашего комментария: если некоторые типы данных не являются varchar, вы можете попытаться использовать CAST как тот же тип (из вашего примера кода вы можете использовать VARCHAR(10), который может совпадать с другими столбцами), иначе вы можете получить ошибка преобразования.

select t1.id,
       t1.CurrentAmount,
       t1.RiskRating,
       t1.ShortName,
       v.Expectioncode
from table1 t1 CROSS APPLY (
   VALUES (ABCD,'ABCD'),
   (EFGH,'EFGH'),
   (IJKL,'IJKL'),
   (CAST(MNOP AS VARCHAR(10)),'MNOP')
) v (val,Expectioncode)
WHERE v.val IS NOT NULL

sqlfiddle

Спасибо, D-Shih, есть один столбец «MNOP», который имеет тип данных с плавающей запятой, поэтому я получаю сообщение об ошибке, не могли бы вы предложить мне. «Ошибка преобразования типа данных varchar в float».

user17824023 10.04.2022 05:23

@user17824023 user17824023 Я редактирую свой ответ, надеюсь, это поможет

D-Shih 10.04.2022 05:30

Другой способ — использовать функцию UNPIVOT. Одним из преимуществ является то, что имена столбцов не нужно определять снова.

SELECT [Id]
      ,[CurrentAmount]
      ,[RiskRating]
      ,[ShortName]
      ,ExceptionCode
  FROM (Select [Id]
      ,[CurrentAmount]
      ,[RiskRating]
      ,[ShortName]
      , ABCD, EFGH, IJKL, CAST(MNOP AS VARCHAR(10)) MNOP
      FROM [Table1]) p
  UNPIVOT 
    (ExceptionCode_Value FOR ExceptionCode IN
        (ABCD, EFGH, IJKL, MNOP)) AS unpvt;

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