我有這個表(地區)與這個樣本值:
| ID | 鱈魚1 | 鱈魚2 | 已付 |
|---|---|---|---|
| 1 | 0001 | 000A | 空值 |
| 2 | 0001 | 000B | 是的 |
| 3 | 0001 | 000B | 是的 |
| 4 | 0001 | 000C | 空值 |
| 5 | 0001 | 000C | 叫喊 |
| 6 | 0001 | 000D | 空值 |
| 7 | 0002 | 000A | 是的 |
| 8 | 0002 | 000C | 空值 |
| 9 | 0002 | 000C | 空值 |
| 10 | 0002 | 000C | 是的 |
| 11 | 0003 | 000C | 是的 |
| 12 | 0004 | 000C | 是的 |
| 13 | 0005 | 000A | 空值 |
| 14 | 0005 | 000A | 是的 |
| 15 | 0005 | 000A | 空值 |
我需要一個回傳這個的選擇:
| 鱈魚1 | 鱈魚2 | NumNullPayed | 已付款數 |
|---|---|---|---|
| 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 的值時。
在前面的示例中,該表有 6 個值/行,其中 Cod1 = 0001;對于 Cod1=0001,我們有 4 個 Cod2 值(A、B、C、D)。
與 cod1 = 0002 相同。但對于 Cod1 = 0003,Cod2 只有一個值(000C),與 0004(000C)相同。
對于 Cod1 = 0005,我們有三行,但始終使用相同的 Cod2 (000A)。因此在選擇中,必須排除 cod1 = 0003、0004 和 0005,因為它們始終具有相同的 Cod2。
見第二個表。
uj5u.com熱心網友回復:
首先過濾到具有一個不同值的行Cod2(我使用MIN/MAX因為你不能做 windowed 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;
資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/380039.html
標籤:sql sql-server 选择 通过...分组 数数
上一篇:如何在Postgres自定義函式中引數化表和列,如果值存在則選擇PK,否則插入并回傳PK?
下一篇:在選擇中獲取當前行的先前值
