2

我有一个零售软件的定价表,其中包含一个项目的 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
4

5 回答 5

5

你可以用很多方法做到这一点。一种方法是创建两组,一组带有 upcs 和正常价格,另一组带有 upcs 和促销价格,然后加入这两组,如下所示:

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

于 2013-02-12T17:43:25.190 回答
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 演示(使用@Beth 的模式)。

于 2013-02-13T09:37:47.940 回答
1

假设您的表已命名Pricing并且您有名为upcpropertycode和的列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
于 2013-02-12T17:43:52.320 回答
0

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

于 2013-02-12T17:48:24.707 回答
0

带有EXISTS 子查询的选项

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上的演示

于 2013-02-12T19:32:08.383 回答