我有一个(简化的)表,其结构如下:
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
在商店3
的零售店铺较低,然后在商店1
& 2
它会被退回。
项目100103
在每个商店位置都有不同的零售,因此会返回。
项目100102
在所有三家商店的零售店均等,因此不会退回。
我不是SQL的新手,但我很遗憾如何在一个有效的庄园中进行这种不等式检查。根据另一列上的分组检查一列中的相等性的最佳方法是什么?
答案 0 :(得分:5)
我能想到的最简单的解决方案是将每个ItemID
的平均值与每个ItemID
的最大(或最小值)进行比较
SQL语句类似于
SELECT ItemID
FROM ItemData
GROUP BY
ItemID
HAVING MAX(Retail) <> AVG(Retail)
请注意,如果retail
可以为空,则会出现此方法失败的情况。
请参阅此SQL Fiddle demo
答案 1 :(得分: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 |
答案 2 :(得分:1)
SELECT *
FROM ItemData
WHERE itemID IN ( SELECT itemID
FROM ItemData
GROUP BY itemID
HAVING COUNT(DISTINCT Retail) > 1
)
答案 3 :(得分:1)
对Lieven充满敬意,我更喜欢这个:
SELECT ItemID
FROM ItemData
GROUP BY
ItemID
HAVING COUNT(DISTINCT Retail)>1