GROUP BY ColA 在 ColaB 中具有各种列值

GROUP BY ColA having various column values in ColB

我想 select ColA 的所有不同值,其中每个元素至少有一个来自 ColB

中给定值集的每个元素

样本table:

ColA  ColB
A     1
A     2
B     1
C     2
C     2
D     NULL
E     1
E     2
E     2
E     3

期望的结果:所有至少有一次 1 和 2 作为 ColB 值的 ColA 值:

A (has 1 once, has 2 once)
E (has 1 once, has 2 twice)

我知道我必须使用 GROUP BY 但不知道确切的聚合函数,我应该使用哪个?

SELECT ... FROM MyTable
GROUP BY ColA
HAVING at_least_values(ColB, (1, 2)) // something like this

什么是好的解决方案?

您可以使用条件逻辑计算 having 子句中的值:

having sum(case when colB = 1 then 1 else 0 end) >= 1 and
       sum(case when colB = 2 then 1 else 0 end) >= 1

intersect 是一种方法。

SELECT ColA FROM MyTable where colB = 1
intersect 
SELECT ColA FROM MyTable where colB = 2

你走在正确的轨道上。您可以使用 WHERE 子句过滤 ColB 中的所有 1 和 2。然后使用 HAVING 子句过滤具有两个值(DISTINCT COUNT of 2)的记录。

-- Return all ColA with a ColB of 1 and 2.emphasized text
SELECT
    ColA
FROM
    Mytable
WHERE
    ColB IN (1, 2)    -- Only 1s and 2s required.
GROUP BY
    ColA
HAVING
    COUNT(DISTINCT ColB) = 2    -- Must have both values.

或者您可以使用 INTERSECT 运算符。这使您可以查找同时出现在两个查询中的记录。请参阅下面的示例。

SELECT
    ColA
FROM
   Mytable
WHERE
    ColB = 1
GROUP BY
   ColA

INTERSECT

SELECT
    ColA
FROM
   Mytable
WHERE
    ColB = 2
GROUP BY
   ColA