#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
к параметру, чтобы ввести его тип.