首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 預存程式:依 ID 區間分組彙總 (動態範圍參數)

     編輯:關於SqlServer

需求:輸入分組邊界參數 '2,5,8,10',依 ID 範圍分組彙總 NUM 欄位:
ID<=2、2、5、8、ID>10。

解法:動態 SQL + 臨時表/表值函數拆分參數

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;

動態版適用於邊界不固定情境;固定版效能更好且易維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved