SQL - 在查询中比较多行

时间:2013-02-12 17:38:30

标签: sql sql-server sql-server-2008-r2

我有零售软件的定价表,其中包含物品的UPC,物业代码(即“REGULAR_PRICE,PROMO_PRICE”)和价格。

示例表:

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

我正在尝试编写查询以查找任何UPC的PROMO_PRICE = REGULAR_PRICE的位置,并输出此条件所在的UPC列表。

我无法弄清楚如何在SQL中编写它。我正在使用SQL Server 2008 R2。

尝试伪代码:

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

5 个答案:

答案 0 :(得分:5)

你可以做很多方法。一种方法是创建两个集合,一个具有upcs和常规价格,另一个具有upc和促销价格,并加入这两个集合,如下所示:

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上试用。

答案 1 :(得分:1)

假设您的表名为Pricing,并且您有名为upcpropertycodeprice的列,则可以对此数据执行自联接。它看起来像是:

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

答案 2 :(得分: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(使用@ Beth的架构)。

答案 3 :(得分:0)

另外......根据您的示例判断 - 看起来像一张桌子 - 如果您在SQL版本中可用,则可以使用LAG()/ LEAD()分析函数来比较数据 - 上一行或下一行与当前行值...

答案 4 :(得分: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                                                    
              )

SQLFiddle上的演示