2013-02-12 9 views
2

У меня есть таблица цен для розничного программного обеспечения, которое содержит UPC для элемента, код свойства (т. Е. «REGULAR_PRICE, PROMO_PRICE») и цену.SQL - Сравнение нескольких строк в запросе

Пример таблицы:

400000320243 REGULAR_PRICE 80 
400000320243 PROMO_PRICE 80 
400000320250 REGULAR_PRICE 50 
400000320250 PROMO_PRICE 40 

Я пытаюсь написать запрос, чтобы найти, где PROMO_PRICE = REGULAR_PRICE для любого УКТ и вывести список УКТ, где выполняется это условие.

Я не могу понять, как это записать в SQL. Я использую SQL Server 2008 R2.

Попытанные псевдо-код:

for each upc: 
    if upc.regular_price = upc.promo_price: 
     print upc 
+0

Промо и регулярно в отдельных таблицах? – CBredlow

+0

Нет, они находятся в одной таблице. – systemnate

ответ

5

Вы можете сделать это с кучей способов. Один из способов заключается в создании двух наборов, один с УКТ и постоянных ценах, а другая с УКТ и промо-цены и присоединиться к этим два комплекта, например:

select r.upc, r.price from 
    (select upc, price from t where propertyCode = 'regular_price') r inner join 
    (select upc, price from t where propertyCode = 'promo_price') p on 
    r.upc = p.upc and 
    r.price = p.price 

Вы можете попробовать его на sqlfiddle.

+0

Большое спасибо за ваш ответ. Это то, что я искал! – systemnate

1

Предполагая, что вы таблица с именем Pricing и у вас есть столбцы с именами upc, propertycode и price, вы могли бы выполнить автообъединение по этим данным. Это будет выглядеть примерно так:

SELECT Reg.upc 
FROM Pricing Reg JOIN Pricing Promo ON Reg.upc = Promo.upc 
WHERE Reg.propertycode = 'REGULAR_PRICE' 
    AND Promo.propertycode = 'PROMO_PRICE' 
    AND Reg.price = Promo.price 
+0

Я не думаю, что это будет работать на MS Sql Server 2008 R2. Что такое 'USING'? Может быть исправлено следующим образом: http://www.sqlfiddle.com/#!3/cc32f/4 –

+0

@zespri ahh, да. Я не понимал, что MS SQL Server не имеет конструкцию USING. Это упрощенный синтаксис для equi-joins (http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join). Я отредактирую свой вопрос, чтобы добавить это. – Wilduck

0

Кроме того ... Судя по вашему примеру - выглядит как стол для меня - вы можете использовать LAG()/LEAD() аналитические функции, если имеющийся в вас версию SQL для сравнить данные - пред или следующую строку с текущими значениями строк ...

+0

FYI, LAG()/LEAD() аналитические функции, доступные в SQLServer2012 –

0

Вариант с EXISTS subquery

SELECT * 
FROM dbo.test3 t1 
WHERE EXISTS (
       SELECT 1 
       FROM dbo.test3 t2 
       WHERE t2.PriceName = CASE WHEN t1.PriceName = 'PROMO_PRICE' THEN 'REGULAR_PRICE' 
             WHEN t1.PriceName = 'REGULAR_PRICE' THEN 'PROMO_PRICE' END 
       AND t1.Price = t2.Price              
      ) 

Demo на SQLFiddle

1

INTERSECT запрос будет также работать здесь:

SELECT upc, price 
FROM atable 
WHERE property_code = 'REGULAR_PRICE' 
INTERSECT 
SELECT upc, price 
FROM atable 
WHERE property_code = 'PROMO_PRICE' 
; 

SQL Fiddle Demo (использует @ схему Бет).

Смежные вопросы