当一列重复时,如何从 table 中 select 行?

How to select rows from table when a column repeats?

我有这个 table (REGIONS) 样本值:

Id Cod1 Cod2 Payed
1 0001 000A NULL
2 0001 000B YES
3 0001 000B YES
4 0001 000C NULL
5 0001 000C YELL
6 0001 000D NULL
7 0002 000A YES
8 0002 000C NULL
9 0002 000C NULL
10 0002 000C YES
11 0003 000C YES
12 0004 000C YES
13 0005 000A NULL
14 0005 000A YES
15 0005 000A NULL

我需要一个 select returns 这个:

Cod1 Cod2 NumNullPayed NumYESPayed
0001 000A 1 0
0001 000B 0 2
0001 000C 1 1
0001 000D 1 0
0002 000A 0 1
0002 000C 2 1

我需要按 Cod1 和 Cod2 分组(并计算为 null 或 yes 的已付)。但只有当我们有一个 Cod1 乘以 Cod2 的值时。

在前面的例子中,table有6个values/row,Cod1 = 0001;对于 Cod1= 0001,我们有 4 个 Cod2 值(A、B、C、D)。

与cod1 = 0002相同。但对于Cod1 = 0003,Cod2只有一个值(000C),与0004相同(000C)。

对于 Cod1 = 0005,我们有三行,但总是具有相同的 Cod2 (000A)。所以在 select 中,cod1 = 0003、0004 和 0005 必须被排除,因为它们总是具有相同的 Cod2。

见第二个table。

首先过滤出 Cod2 具有一个不同值的行(我使用 MIN/MAX,因为你不能使用窗口 COUNT(DISTINCT...)),然后合计:

WITH CTE AS(
    SELECT V.Cod1,
           V.Cod2,
           Payed, WHEN MIN(Cod2) OVER (PARTITION BY Cod1) = MAX(Cod2) OVER (PARTITION BY Cod1) THEN 0 ELSE 1 END AS C
    FROM (VALUES(1    ,'0001','000A',NULL),
                (2    ,'0001','000B','YES'),
                (3    ,'0001','000B','YES'),
                (4    ,'0001','000C',NULL),
                (5    ,'0001','000C','YELL'),
                (6    ,'0001','000D',NULL),
                (7    ,'0002','000A','YES'),
                (8    ,'0002','000C',NULL),
                (9    ,'0002','000C',NULL),
                (10   ,'0002','000C','YES'),
                (11   ,'0003','000C','YES'),
                (12   ,'0004','000C','YES'),
                (13   ,'0005','000A',NULL),
                (14   ,'0005','000A','YES'),
                (15   ,'0005','000A',NULL))V(Id,Cod1,Cod2,Payed))
SELECT Cod1,
       Cod2,
       COUNT(CASE Payed WHEN 'Yes' THEN 1 END) AS Payed,
       COUNT(CASE WHEN Payed IS NULL THEN 1 END) AS NotPayed
FROM CTE C
WHERE c = 1
GROUP BY Cod1,
         Cod2;

db<>fiddle