Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL计数在一列中重复,但重复的条件不仅仅是一个固定值_Sql_Oracle_Count_Conditional - Fatal编程技术网

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

SQL计数在一列中重复,但重复的条件不仅仅是一个固定值,sql,oracle,count,conditional,Sql,Oracle,Count,Conditional,我尝试搜索其他帖子,但只能找到关于查找一个固定值的重复项 想象一下下表: ╔══════════╦═══════╗ ║ customer ║ color ║ ╠══════════╬═══════╣ ║ 1 ║ black ║ ║ 1 ║ black ║ ║ 2 ║ red ║ ║ 2 ║ black ║ ║ 3 ║ red ║ ║ 3 ║ red ║ ║ 3 ║ r

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

想象一下下表:

 ╔══════════╦═══════╗
 ║ customer ║ color ║
 ╠══════════╬═══════╣
 ║        1 ║ black ║
 ║        1 ║ black ║
 ║        2 ║ red   ║
 ║        2 ║ black ║
 ║        3 ║ red   ║
 ║        3 ║ red   ║
 ║        3 ║ red   ║
 ║        4 ║ black ║
 ║        5 ║ black ║
 ║        5 ║ green ║
 ║        6 ║ purple║
 ╚══════════╩═══════╝
我想选择“副本”是指以下客户:

  • 有不止一个黑人
  • 一个黑色和另一个红色也是复制品
  • 无重复:客户可以拥有任意数量的红色
到目前为止我所拥有的 目前我只能选择黑色的复制品,但我不能将其与“一黑不再红”的条件组合

也许我可以先数一数黑人,然后再加入现有的表,再数一数额外的黑人和红色

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

╔══════════╦═══════════╦══════════════╗
║ customer ║ blackOnly ║ blackPlusRed ║
╠══════════╬═══════════╬══════════════╣
║        1 ║ yes       ║ no           ║
║        2 ║ no        ║ yes          ║
╚══════════╩═══════════╩══════════════╝
对不起,我不得不修改我的帖子
  • 我在示例表中添加了客户5和6以及更多颜色。所以也许有些建议不再有效了:-(。 (只是想快速编辑,所以如果我没有遵循一些修改规则,请告诉我)
  • 谢谢你到目前为止的快速回答

您希望所有客户都有“黑色”和至少两条记录。您可以通过条件聚合实现这一点:

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;
更新:如果允许使用其他颜色,则查询会略有更改:

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

此查询首先为每个客户创建一个包含黑色和红色计数的临时表,然后查询此表以获取每个客户的
blackOnly
blackPlusRed
列值

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
下面是一个演示:


如果客户1也有一个红色怎么办?他仍然是只黑的吗?从下面三个回答中选择一个:-)@pablomatico:对,我没有指定这一点。最好的办法是同时考虑两种情况,而不是将标签从“blackOnly”改为“blackDouble”。但更重要的是正确选择客户。谢谢你没有提到你期望的新颜色的结果。@NeriaNachum:结果不应该因为新颜色而改变。“重复”含义的相同条件适用。我不得不添加它,因为一些解决方案正确地假设示例是问题的全部,所以他们构建了满足简化条件的解决方案。抱歉,我编辑了我的帖子并添加了更多颜色。因此,我不能再将条件限制为“您希望所有客户都有‘黑色’和至少两张记录”。如果仍然有一个没有子选择的解决方案,我将不胜感激。如果有必要,子查询没有任何问题。顺便说一句,名字不错^^@Timgay:然后简单地更改条件。我已经更新了我的答案。@TimBiegeleisen:你是对的,子查询没有错,我喜欢它,因为它通常更容易阅读。就我的情况而言,我从Java端使用的SQL更容易适应。名字真不错;-)。ThanksI也喜欢EXISTS子句,并且总是想知道为什么这么多人加入,而只是为了在之后使用DISTINCT来消除生成的重复项:-)然而,在这里,如果您只想从一个表中获取客户的信息,聚合是一种直接的方法,而且通常更快,你不应该鼓励对字符串文本使用非标准的双引号。改为使用单引号。MySQL容忍的许多事情不属于ANSI标准的一部分,例如允许
GROUP BY
中的列不是聚合。这是非常糟糕的做法,但欢迎来到开源世界。
CASE WHEN t.red > 1 AND t.black = 0 THEN 'yes' ELSE 'no' END AS redOnly