【问题标题】:Comparing Similar Columns for Equality比较相似列的相等性
【发布时间】:2012-12-26 13:37:47
【问题描述】:

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

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 并不陌生,但我不知道如何在有效的庄园中进行这种不等式检查。根据另一列上的分组检查一列中是否相等的最佳方法是什么?

【问题讨论】:

  • 如果三个店铺的retail都不一样怎么办?
  • 编辑了 OP 以举例说明这种情况。预期/期望的行为是返回该项目。
  • @你刚刚更新问题了吗?

标签: sql equality inequality


【解决方案1】:

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

SQL 语句类似于

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

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

看到这个SQL Fiddle demo

【讨论】:

  • Store 不是表格...您可以选择FROM 列吗?
  • @awashburn - 你没有告诉我们表名,所以我使用了Store,因为这对我来说很有意义。只需将其替换为您的实际表名即可。
  • @LievenKeersmaekers 我认为您的WHERE 需要是HAVING。但是很好的解决方案。
  • @MikeSmithDev - 感谢您的理解。我已经更新了答案。
  • @LievenKeersmaekers +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 |

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 虽然所有答案都适用于 OP 中提供的示例数据,但这是 唯一 答案,它使用我的 实际 数据库数据返回所需结果。
    • 我不确定为什么这会给出与 Lieven 的答案不同的结果。我只是放了它,因为它更快。如果结果确实不同,那么这一事实值得单独提出问题。
    【解决方案4】:
    SELECT *
      FROM ItemData
      WHERE itemID IN ( SELECT itemID
                          FROM ItemData
                          GROUP BY itemID
                          HAVING COUNT(DISTINCT Retail) > 1
                      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多