Отображение данных, присутствующих в нескольких столбцах

#sql #sql-server

#sql #sql-сервер

Вопрос:

нужна небольшая помощь. Я работаю на SQL Server, и мне нужно отображать данные, которые находятся в нескольких столбцах, но в разных строках. Я пытался использовать exists, но это не сработало. И join не работает в этом сценарии, как и оператор and / or .

 Part name      supplier01     supplier02     supplier03
a1                 1              3            zzz 
b1                 2              4
c1                 3             zzz
d1                 4                            1
e1                zzz             1             2
 

Теперь в приведенном выше примере часть a продается поставщиком 1, 3 и 5. Часть b продается поставщиком 2 и 4 и так далее и тому подобное.

Что мне нужно сделать, это отобразить список всех деталей, проданных поставщиком one, но в разных столбцах. Таким образом, отображение должно выглядеть следующим образом

 Part name      supplier01     supplier02     supplier03
a1                 1                                    
d1                                               1
e1                                 1             
 

Любая помощь или мысли приветствуются.
Обновление: Извините, в моем первоначальном вопросе я забыл упомянуть, что столбцы Partname, supplier01, supplier02, supplier 03 являются navchar .

Комментарии:

1. Найдите первую обычную форму . Что вы будете делать, если вам понадобится поставщик № 4? Лучше всего создать таблицу ссылок PartSupplier , тогда этот запрос будет тривиальным

Ответ №1:

Интересно, будет ли изменение формата результирующего набора на самом деле более полезным:

 select t.partname, v.*
from t cross apply
     (values (supplier01, 1), (supplier02, 2), (supplier03, 3)) v(supplier, which)
where supplier = 1;
 

Это возвращает значения в отдельных строках с «столбцом» в виде числа. Это кажется более полезным способом представления информации.

Ответ №2:

Вы можете сделать:

 select
  part_name,
  case when supplier01 = 'ONEILE' then 'ONEILE' end as supplier01,
  case when supplier02 = 'ONEILE' then 'ONEILE' end as supplier02,
  case when supplier03 = 'ONEILE' then 'ONEILE' end as supplier03
from t
where supplier01 = 'ONEILE' 
   or supplier02 = 'ONEILE' 
   or supplier03 = 'ONEILE'
 

Если вы хотите указать параметр (‘ONEILE’) только один раз, вы можете сделать:

 with p (s) as (select 'ONEILE'::varchar) -- parameter supplier # here
select
  t.part_name,
  case when t.supplier01 = p.s then p.s end as supplier01,
  case when t.supplier02 = p.s then p.s end as supplier02,
  case when t.supplier03 = p.s then p.s end as supplier03
from t
cross join p
where t.supplier01 = p.s or t.supplier02 = p.s or t.supplier03 = p.s
 

Комментарии:

1. я забыл упомянуть в своем первоначальном запросе, что коды partname и supplier являются varchar . Ваше решение работает, большое спасибо за это, но я получаю эту ошибку после быстрого просмотра таблицы: «Ошибка преобразования при преобразовании значения nvarchar ‘ONEILE’ в тип данных int «.

2. В столбце supplier01 есть поставщик с именем ‘ONEILE’

3. @Leo Вы VARCHAR также можете использовать a . См. Измененный ответ.

4. Спасибо, Impaler, проблема, с которой я столкнулся, заключается в том, что когда я использую ‘1’ в качестве параметра, при выполнении скрипта я получал ошибку ошибки преобразования.

5. @Leo Добавьте ::varchar к параметру, чтобы ввести его тип.