我有零售软件的定价表,其中包含物品的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
答案 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
,并且您有名为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
答案 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)
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上的演示