需求:輸入分組邊界參數 '2,5,8,10',依 ID 範圍分組彙總 NUM 欄位:
ID<=2、258ID>10。
CREATE PROCEDURE usp_SumByIdRanges
@Boundaries VARCHAR(200) -- 例如 '2,5,8,10'
AS
BEGIN
SET NOCOUNT ON;
-- 1. 將邊界字串拆分為有序數值表
DECLARE @b TABLE (seq INT IDENTITY(1,1), val INT);
DECLARE @xml XML = N' ';
INSERT INTO @b (val)
SELECT CAST(T.c.value('.', 'VARCHAR(20)') AS INT)
FROM @xml.nodes('/r') T(c);
-- 2. 動態建構 CASE WHEN 分組邏輯
DECLARE @sql NVARCHAR(MAX) = N'
SELECT
CASE
WHEN ID <= ' + CAST((SELECT TOP 1 val FROM @b ORDER BY seq) AS VARCHAR(10)) + N' THEN ''ID<=' + CAST((SELECT TOP 1 val FROM @b ORDER BY seq) AS VARCHAR(10)) + N'''
';
DECLARE @prev INT = (SELECT TOP 1 val FROM @b ORDER BY seq);
DECLARE @cur INT;
DECLARE cur CURSOR FOR SELECT val FROM @b ORDER BY seq;
OPEN cur;
FETCH NEXT FROM cur INTO @cur; -- skip first
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql += N' WHEN ID > ' + CAST(@prev AS VARCHAR(10)) + N' AND ID <= ' + CAST(@cur AS VARCHAR(10)) + N' THEN '''+CAST(@prev AS VARCHAR(10))+N'' + CAST(@prev AS VARCHAR(10)) + N''' END AS GroupRange,
SUM(NUM) AS TotalNum
FROM YourTable
GROUP BY
CASE
WHEN ID <= ' + CAST((SELECT TOP 1 val FROM @b ORDER BY seq) AS VARCHAR(10)) + N' THEN 1
';
-- 同樣迴圈補充 GROUP BY CASE...
SET @sql += N' END;';
EXEC sp_executesql @sql;
END
SELECT
CASE
WHEN ID <= 2 THEN 'ID<=2'
WHEN ID <= 5 THEN '210'
END AS GroupRange,
SUM(NUM) AS TotalNum
FROM YourTable
GROUP BY
CASE
WHEN ID <= 2 THEN 1
WHEN ID <= 5 THEN 2
WHEN ID <= 8 THEN 3
WHEN ID <= 10 THEN 4
ELSE 5
END;
動態版適用於邊界不固定情境;固定版效能更好且易維護。