SQL计数一列中的重复项,但重复项的条件不仅仅是一个固定值

标签 sql oracle count conditional-statements

我尝试搜索其他帖子,但只能找到关于查找一个固定值的重复项的信息。

想象一下下表:

 ╔══════════╦═══════╗
 ║ customer ║ color ║
 ╠══════════╬═══════╣
 ║        1 ║ black ║
 ║        1 ║ black ║
 ║        2 ║ red   ║
 ║        2 ║ black ║
 ║        3 ║ red   ║
 ║        3 ║ red   ║
 ║        3 ║ red   ║
 ║        4 ║ black ║
 ║        5 ║ black ║
 ║        5 ║ green ║
 ║        6 ║ purple║
 ╚══════════╩═══════╝

我要选择的“重复项”是指以下客户:

  • 有多个黑色
  • 一个黑色和另一个红色也是重复的
  • 没有重复:顾客可以购买任意数量的红色

到目前为止我所拥有的

目前我只能选择黑色重复项,但无法将其与“一个黑色,不再是红色”条件结合起来。

SELECT customer FROM events WHERE
    color = 'black'
    group by customer
    having count(*) > 1

也许我可以先计算黑色,然后再次加入现有表中计算其他黑色和红色?

期望的输出

作为客户,我希望得到以下结果:1,2。 更好的是我知道客户是双黑还是黑+一些红的输出:

╔══════════╦═══════════╦══════════════╗
║ customer ║ blackOnly ║ blackPlusRed ║
╠══════════╬═══════════╬══════════════╣
║        1 ║ yes       ║ no           ║
║        2 ║ no        ║ yes          ║
╚══════════╩═══════════╩══════════════╝

抱歉,不得不修改我的帖子

  • 我在示例表中添加了客户 5 和 6 以及更多颜色。所以也许有些建议不再有效:​​-(。 (只是想快速编辑,所以如果我没有遵循一些修改规则,请告诉我)
  • 感谢您迄今为止的快速答复

最佳答案

此查询首先创建一个临时表,其中包含每个客户的黑色和红色计数,然后查询该表以获取 blackOnlyblackPlusRed 列值,例如每个客户。

SELECT t.customer,
    CASE WHEN t.black > 1 AND t.red = 0 THEN 'yes' ELSE 'no' END AS blackOnly,
    CASE WHEN t.black > 0 AND t.red > 0 THEN 'yes' ELSE 'no' END AS blackPlusRed
FROM
(
    SELECT *,
        SUM(CASE WHEN color='black' THEN 1 ELSE 0 END) AS black,
        SUM(CASE WHEN color='red' THEN 1 ELSE 0 END) AS red
    FROM events
    GROUP BY customer
) t

如果您想添加新的颜色条件,例如只有红色,那么您可以向外部查询添加新的 CASE 语句:

CASE WHEN t.red > 1 AND t.black = 0 THEN 'yes' ELSE 'no' END AS redOnly

这是一个演示:

SQLFiddle

关于SQL计数一列中的重复项,但重复项的条件不仅仅是一个固定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33341782/

相关文章:

c# - Dapper:帮助我运行具有多个用户定义的表类型的存储过程

sql - 二进制掩码预言机

xml - XPath 中的计数函数

mysql - 使用多个连接 sql 查找多个计数

mysql - SQL - 计算两行之间的差异并放入另一列

mysql - 使用大量可能的连接进行查询的最佳方法

mysql - 如何提高mysql中的select性能?

sql - 旋转日期以获得层次结构中节点总和的汇总

database - Oracle 11g(Application Express Edition)如何导出导入数据库?

Mysql 计数不同的结果