SQL-比较查询中的多行

SQL-比较查询中的多行,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有一个零售软件的定价表,其中包含商品的UPC、属性代码(即“常规价格、促销价格”)和价格 示例表: 400000320243 REGULAR_PRICE 80 400000320243 PROMO_PRICE 80 400000320250 REGULAR_PRICE 50 400000320250 PROMO_PRICE 40 我正在尝试编写一个查询,以查找任何UPC的促销价格=常规价格的位置,并输出一个符合此条件的UPC列表 我不知道如何用SQL写这个。我正在使用SQLServer200

我有一个零售软件的定价表,其中包含商品的UPC、属性代码(即“常规价格、促销价格”)和价格

示例表:

400000320243 REGULAR_PRICE 80
400000320243 PROMO_PRICE 80
400000320250 REGULAR_PRICE 50
400000320250 PROMO_PRICE 40
我正在尝试编写一个查询,以查找任何UPC的促销价格=常规价格的位置,并输出一个符合此条件的UPC列表

我不知道如何用SQL写这个。我正在使用SQLServer2008R2

尝试的伪代码:

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

你可以用很多方法。一种方法是创建两个集合,一个包含UPC和常规价格,另一个包含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

你可以试穿一下

假设您的表名为
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

此外。。。根据您的示例判断-在我看来像一个表-您可以使用LAG()/LEAD()分析函数(如果您的SQL版本中可用)来比较数据-上一行或下一行与当前行值…

选项与

上演示查询也将在此处工作:

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

(使用@Beth的模式)。

promo和regular在不同的表中吗?不,它们在同一个表中。仅供参考,SQLServer2012中提供的LAG()/LEAD()分析函数我认为不会在MS Sql Server 2008 R2上运行。什么是
使用的
?可以这样修复:@zespri啊,是的。我没有意识到MS SQL Server没有使用构造。这是equi连接()的简化语法。我将编辑我的问题,将其添加进去。非常感谢您的回复。这就是我要找的!
SELECT upc, price
FROM atable
WHERE property_code = 'REGULAR_PRICE'
INTERSECT
SELECT upc, price
FROM atable
WHERE property_code = 'PROMO_PRICE'
;