標準彙總函數(`MAX`、`SUM` 等)僅能對「同一欄位的多列」運算。若需對「同一列的多個欄位」(如 a,b,c,d,e,f)做跨列聚合,傳統寫法需大量 `CASE` 判斷。本文介紹利用 `FOR XML PATH` 將欄位序列化為 XML,再以 XQuery 還原為資料列集,最後套用彙總函數的巧妙技巧。
-- 建立測試資料
DECLARE @t TABLE (
id SMALLINT,
a SMALLINT, b SMALLINT, c SMALLINT,
d SMALLINT, e SMALLINT, f SMALLINT
);
INSERT INTO @t VALUES
(1, 1, 2, 3, 4, 6, 7),
(2, 34, 45, 56, 54, 9, 6);
-- 跨列聚合查詢
SELECT a.*, c.*
FROM @t a
OUTER APPLY (
SELECT doc = (
SELECT * FROM @t AS doc WHERE id = a.id FOR XML PATH(''), TYPE
)
) b
OUTER APPLY (
SELECT
MIN(r) AS minValue,
MAX(r) AS maxValue,
SUM(r) AS sumValue,
AVG(r) AS avgValue
FROM (
SELECT CAST(CAST(d.n.query('text()') AS VARCHAR(MAX)) AS INT) AS r
FROM doc.nodes('/a,b,c,d,e,f') D(n)
) tt
) c;
| id | a | b | c | d | e | f | minValue | maxValue | sumValue | avgValue |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 2 | 3 | 4 | 6 | 7 | 1 | 7 | 23 | 3 |
| 2 | 34 | 45 | 56 | 54 | 9 | 6 | 6 | 56 | 204 | 34 |