SQL Count在一列中重复,但重复的条件不仅是一个固定值

时间:2015-10-26 08:55:11

标签: sql oracle count conditional

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

想象一下下表:

 ╔══════════╦═══════╗
 ║ 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。所以也许一些建议不再适用:-(。 (只想快速编辑,所以如果我没有遵循一些修改规则,请告诉我)
  • 感谢目前为止非常快速的答案

2 个答案:

答案 0 :(得分:2)

此查询首先创建一个临时表,其中包含每个客户的黑色和红色计数,然后查询此表以获取每个客户的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

答案 1 :(得分:1)

您希望所有客户都拥有黑色'和至少两个记录。您可以使用条件聚合执行此操作:

localhost

更新:如果您允许其他颜色,则查询稍有变化:

select 
  customer,  
  case when count(distinct color) = 1 then 'yes' else 'no' end as blackOnly,
  case when count(distinct color) > 1 then 'yes' else 'no' end as blackPlusRed
from events 
group by customer
having count(*) > 1
and count(case when color = 'black' then 1 end) > 0;