我有
| 組變數 | 子變數 | 瓦爾 |
|---|---|---|
| G1 | 一個 | X |
| G1 | 一個 | X |
| G1 | 乙 | X |
| G1 | 乙 | 是的 |
| G1 | C | z |
| G1 | C | z |
| G2 | 一個 | X |
| G2 | 一個 | X |
| G2 | 乙 | 是的 |
| G2 | 乙 | z |
| G2 | 乙 | w |
| G2 | C | z |
而且我要
| 組變數 | 所有 計數(不同的 Val) |
計數(不同的 Val ,其中 Subvar=A ) |
B 計數(不同的 Val ,其中 Subvar=B) |
C 計數(不同的 Val ,其中 Subvar=C) |
|---|---|---|---|---|
| G1 | 3 | 1 | 2 | 1 |
| G2 | 4 | 1 | 3 | 1 |
偽代碼可能是
Select
Groupvar,
count(distinct x) as All,
count( distinct x where Subvar='A') as A,
count( distinct x where Subvar='B') as B,
count( distinct x where Subvar='C') as C
Group by Groupvar
我可以做到這一點
CREATE TABLE #have (
Groupvar VARCHAR(2),
Subvar VARCHAR(1),
Val VARCHAR(1));
INSERT INTO #have (Groupvar, Subvar, Val )
VALUES
('G1', 'A', 'x'), ('G1', 'A', 'x'), ('G1', 'B', 'x'), ('G1', 'B', 'y'), ('G1', 'C', 'z'), ('G1', 'C', 'z'),
('G2', 'A', 'x'), ('G2', 'A', 'x'), ('G2', 'B', 'y'), ('G2', 'B', 'z'), ('G2', 'B', 'w'), ('G2', 'C', 'z');
WITH t1 AS (
SELECT Groupvar, 'All' AS Subvar, COUNT(DISTINCT Val ) AS N_Val FROM #have T1
GROUP BY Groupvar
UNION
SELECT Groupvar, Subvar, COUNT(DISTINCT Val ) AS N_Val FROM #have T1
GROUP by Groupvar, Subvar
)
SELECT * FROM t1
PIVOT (SUM(N_Val) FOR Subvar IN([All],[A],[B],[C])) AS pt
但我想知道是否有一種方法可以在一個看起來更像我的偽代碼示例的單個 select 陳述句中執行此操作?
uj5u.com熱心網友回復:
您需要聚合函式中CASE的運算式COUNT()來應用條件聚合:
SELECT Groupvar,
COUNT(DISTINCT Val) [All],
COUNT(DISTINCT CASE WHEN Subvar = 'A' THEN Val END) A,
COUNT(DISTINCT CASE WHEN Subvar = 'B' THEN Val END) B,
COUNT(DISTINCT CASE WHEN Subvar = 'C' THEN Val END) C
FROM tablename
GROUP BY Groupvar;
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/425381.html
標籤:sql服务器 tsql 通过...分组 案件 条件聚合
上一篇:從父級別的節點檢索值
