平等

2013-01-11 32 views
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有在商店3較低的零售然後在商店1 & 2則返回。

  • 項目100103在每個存儲位置不同的零售也就不會返回它。

  • 項目100102有平等的,在它的零售在三個店面所以它不會返回。

我不是新來的SQL,但我失去了如何使這種不平等檢查在一個有效的莊園。根據另一列上的分組檢查一列中的相等性的最佳方法是什麼?

+0

你會怎麼做,如果'retail'在所有三個商店有什麼不同? – peterm

+0

編輯的OP,得到該情況下的一個例子。預期/期望的行爲將是返回該項目。 –

+0

@你剛更新了這個問題嗎? – bonCodigo

回答

1

與所有應有的尊重利芬,我更喜歡這樣的:

SELECT ItemID 
FROM ItemData 
GROUP BY 
     ItemID 
HAVING COUNT(DISTINCT Retail)>1 
+0

雖然所有答案都與OP提供的樣本數據一起工作,但這是* only *答案,用我的**實際**數據庫數據返回了期望的結果。 –

+0

我不知道爲什麼這會給列文的答案帶來不同的結果。我只是說,因爲它更快。如果結果確實不同,那麼這個事實值得另外提出一個問題。 – Bulat

5

我能想到的最簡單的辦法是隻各ItemID的平均與最大(或最小爲此事),比較各ItemID

的SQL語句會是這樣的

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

請注意,如果retail是可爲空的,則有場景的這種方法失敗。

看到這個SQL Fiddle demo

+0

'Store'不是表...你可以選擇'FROM'一列? –

+0

@awashburn - 你沒有告訴我們表名,所以我使用了'Store',因爲它對我來說很有意義。只需將其替換爲實際的表名即可。 –

+0

@LievenKeersmaekers我認爲你的'WHERE'必須是'HAVING'。但好的解決方案。 – MikeSmithDev

1
SELECT * 
    FROM ItemData 
    WHERE itemID IN (SELECT itemID 
         FROM ItemData 
         GROUP BY itemID 
         HAVING COUNT(DISTINCT Retail) > 1 
       ) 
2

另一種方法:但我仍然愛@利維的答案:)我的查詢告訴你不同的價格的數量爲好。

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 |