平等

2013-01-11 33 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 |