我尝试搜索其他帖子,但只能找到有关一个固定值的重复项。
想象一下下表:
╔══════════╦═══════╗
║ 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 ║
╚══════════╩═══════════╩══════════════╝
答案 0 :(得分:2)
此查询首先创建一个临时表,其中包含每个客户的黑色和红色计数,然后查询此表以获取每个客户的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 :(得分: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;