簡體   English   中英

SQL-比較查詢中的多行

[英]SQL - Comparing Multiple Rows in Query

我有一個零售軟件的價格表,其中包含一個商品的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

你可以做很多方法。 一種方法是創建兩個集合,一個具有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試試

假設您的表名為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

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的架構)。

另外...根據您的示例判斷-對我來說就像一張表-如果您的SQL版本中可用,則可以使用LAG()/ LEAD()分析函數來比較數據-上一行或下一行與當前行值。 。

帶有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上演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM