1

示例表:

table

transport    color
-------------------
car           red
car           red
car           blue
bike          yellow
bike          blue
motorbike     red
scooter       blue
scooter       blue
scooter       blue
scooter       yellow

如何计算只有蓝色和/或黄色的唯一传输值的数量?

所以,我想要的结果是:2(1 用于自行车,1 用于踏板车)。即使它有一个蓝色条目,我也不想计算汽车。

要指定:如果运输只有蓝色 = 计数。如果运输有蓝色和黄色=计数。如果运输有蓝色和红色 = 没有计数。如果它有蓝色、黄色和红色 = 不计数。

这如何在 MySQL 查询中完成?

4

2 回答 2

0

这表明not exists

select count(distinct transport)
from t
where not exists (select 1
                  from t t2
                  where t2.transport = t.transport and
                        t2.color not in ('blue', 'yellow')
                 );

您也可以使用条件聚合来执行此操作:

select ( count(distinct transport) -
         count(distinct case when t2.color not in ('blue', 'yellow') then transport end)
       )
from t;

这会计算transports表中的数量。然后它减去颜色不是蓝色或黄色的数字。

于 2020-05-19T11:30:58.987 回答
0

你可以试试:

SELECT COUNT(*) AS cnt
FROM
(
    SELECT transport
    FROM yourTable
    GROUP BY transport
    HAVING SUM(color NOT IN ('blue', 'yellow')) = 0
) t;

首先,我们可以通过传输聚合并仅保留具有至少一种颜色(蓝色或黄色)的组。然后,计算此子查询的计数,即匹配传输的数量。

顺便说一句,在 MySQL 8+ 中,有一种方法可以在不使用子查询的情况下编写它:

SELECT COUNT(*) OVER () AS cnt
FROM yourTable
WHERE color IN ('blue', 'yellow')
GROUP BY transport
HAVING SUM(color NOT IN ('blue', 'yellow')) = 0
LIMIT 1;
于 2020-05-19T08:03:10.577 回答