1

我有一个(简化的)表,其结构如下:

Table: ItemData

PK | ItemID | StoreFK | Retail
1  | 100101 | 1       | 4.99
4  | 100101 | 2       | 4.99
7  | 100101 | 3       | 0.99
2  | 100102 | 1       | 6.99
5  | 100102 | 2       | 6.99
8  | 100102 | 3       | 6.99
3  | 100103 | 1       | 7.99
6  | 100103 | 2       | 8.99
9  | 100103 | 3       | 9.99

我想退回一家或多家商店零售店不同的所有商品:

回报:

ItemID
100101 
100103 
  • 商品在商店100101的零售额低于商店的零售价,并且被退回。312

  • 商品100103在每个商店位置都有不同的零售店,因此会被退回。

  • 商品100102在所有三个商店的零售额相同,因此不予退货。

我对 SQL 并不陌生,但我不知道如何在有效的庄园中检查这种不等式。根据另一列上的分组检查一列中是否相等的最佳方法是什么?

4

4 回答 4

5

我能想到的最简单的解决方案是将每个的平均值与每个ItemID的最大值(或最小值)进行比较ItemID

SQL 语句类似于

SELECT ItemID
FROM   ItemData
GROUP BY
       ItemID
HAVING MAX(Retail) <> AVG(Retail)

请注意,如果retail可以为空,则存在场景的此方法失败。

请参阅此SQL Fiddle 演示

于 2013-01-11T21:59:42.757 回答
2

另一种方法:但我仍然喜欢@Liven 的回答 :) 我的查询也告诉您不同价格的数量。

select x.itemid, count(x.storefk) from (
select a.* , 
row_number() over 
(partition by a.retail order by
                   a.itemid desc) as r
from retailers a)x
group by x.itemid, x.r
having count(*) > 1
;

结果:根据 OP 更新的问题和数据。

| ITEMID | COLUMN_1 |
---------------------
| 100101 |        2 |
| 100103 |        3 |
于 2013-01-11T22:15:03.193 回答
1
SELECT *
  FROM ItemData
  WHERE itemID IN ( SELECT itemID
                      FROM ItemData
                      GROUP BY itemID
                      HAVING COUNT(DISTINCT Retail) > 1
                  )
于 2013-01-11T22:01:24.190 回答
1

恕我直言,我更喜欢这个:

SELECT ItemID
FROM   ItemData
GROUP BY
       ItemID
HAVING COUNT(DISTINCT Retail)>1
于 2013-01-11T22:55:46.567 回答