2017-02-20 9 views
1

Разочаровываю, я работаю со столом, где имя строки должно быть значением. Как я могу выбрать эту строку в SQL Server на основе значения? Я направленный на то, что выглядит следующим образом:Как выбрать строку переменных в SQL Server?

;with QueryItems as 
(
    select year, model 
    from items 
) 
select ?QueryItems.model? as Price 
from Pricing 
where Year = QueryItems.year 

Элементы таблицы:

item year  model 
------------------------ 
xx  2001  MODELC 
yy  2002  MODELA 
zz  2002  MODELD 

Таблица цен является странным один, настроить как:

YEAR MODELA MODELB MODELC MODELD 
------------------------------------------ 
2000 100  101  102  103 
2001 205  206  250  300 
2002 1000  1200  1500  1700 

Результаты I» м, предназначенные для:

item year model price 
---------------------------- 
xx  2001 MODELC 250 
yy  2002 MODELA 1000 
zz  2002 MODELD 1700 
+0

попробуйте динамический запрос – McNets

+0

Вам нужен один выбор для каждой модели? – McNets

+0

Я ищу таблицу результатов, которые вернут это как часть более крупного запроса. –

ответ

2

DEMO

использовать UNPIVOT, а затем присоединиться к вашей таблице элементов.

WITH cte as (
    SELECT [Year], [Model], [Price] 
    FROM (SELECT [Year], [MODELA], [MODELB], [MODELC], [MODELD] 
      FROM pricing) p 
    UNPIVOT 
     ([Price] FOR [Model] IN 
        ([MODELA], [MODELB], [MODELC], [MODELD]) 
     ) as unpvt 
) 
SELECT i.*, c.price 
FROM cte c 
JOIN items i 
    ON c.[Year] = i.[Year] 
AND c.[Model] = i.[model] 

ВЫВОД

enter image description here

1

Это может быть сделано с помощью стандартного SQL, хотя и немного уродливый:

select i.item, 
     i.year, 
     i.model, 
     case i.model 
      when 'MODELA' then p.MODELA 
      when 'MODELB' then p.MODELB 
      when 'MODELC' then p.MODELC 
      when 'MODELD' then p.MODELD 
     end as price 
from Items i INNER JOIN Pricing p ON p.year = i.year 

Rextexter demo

+0

Сопровождайте использование эксклюзионного 'JOIN' sintaxis, Аарон Бертран написал хорошую статью [Плохие привычки пинать: использование JOIN в старом стиле] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/ bad-habitits-to-kick-using-old-style-joins.aspx) об этом. –

+0

Спасибо, Хуан, это была просто попытка; Мне не разрешено делать такую ​​незначительную коррекцию, хотя после того, как вы отредактировали мой пост. –

+0

Да, вы можете, просто перезагрузите страницу, чтобы у вас была последняя версия. –

1

Что плохой дизайн :(В любом случае, вы можете делать то, что вы хотите в ряде путей и один способ заключается в использовании UNPIVOT:

declare @t1 table (item varchar(10), year int,  model varchar(10)); 
insert @t1 (item,year,model) values 
('xx',2001,'MODELC'), 
('yy',2002,'MODELA'), 
('zz',2002,'MODELD'); 

declare @t2 table (year int, modela int, modelb int, modelc int, modeld int); 

insert @t2 (YEAR, MODELA, MODELB, MODELC, MODELD) values 
(2000,100 ,101 ,102 ,103), 
(2001,205 ,206 ,250 ,300), 
(2002,1000,1200,1500,1700); 

with up as 
( 
    select year, v, model 
    from 
    (select YEAR, MODELA, MODELB, MODELC, MODELD from @t2) p 
    unpivot 
    (v for model in (MODELA, MODELB, MODELC, MODELD)) as unp 
) 
select t1.*, up.v from @t1 t1 inner join up on t1.year = up.year and t1.model = up.model;