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

1つ以上の店舗で小売店が異なるすべての商品を返品したいと思います。

戻り値:

ItemID
100101 
100103 
  • アイテムの小売価格は店頭よりも店頭で100101低く、返品されます。312

  • 商品100103の小売店は店舗ごとに異なるため、返品されます。

  • アイテム100102は3つの店舗すべてで小売りで平等であるため、返品されません。

私はSQLに不慣れではありませんが、この不等式チェックを効率的な方法で行う方法については迷っています。別の列のグループ化に基づいて、ある列の同等性をチェックするための最良の方法は何ですか?

4

4 に答える 4

5

私が考えることができる最も簡単な解決策は、それぞれの平均をそれぞれItemIDの最大(または最小)と比較することですItemID

SQLステートメントは次のようになります

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

retailnullable の場合、このメソッドが失敗するシナリオがあることに注意してください。

この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

Lievenに敬意を表して、私はこれを好みます。

SELECT ItemID
FROM   ItemData
GROUP BY
       ItemID
HAVING COUNT(DISTINCT Retail)>1
于 2013-01-11T22:55:46.567 に答える
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 に答える