当一列重复时,如何从 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;
我有这个 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;