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

SQL Server 存儲過程實現動態行轉列(縱向轉橫向)

     編輯:關於SqlServer

報表開發中常遇到「行轉列」需求:將垂直分布的類別值(如科室、產品)轉為水平列顯示。本文提供一個通用存儲過程 Model_his_mid,支持動態列生成、條件篩選、排序、Top N 及行合計。

參數設計

參數說明
@vColumns分組列(如就診日期、醫生),最後一列後不加逗號
@vClauseWHERE 條件(無條件傳空串)
@vOrderby結果排序字段(空則默認)
@vTop返回行數(空則全部)

核心邏輯

  1. 固定業務表 his_mid_tab、轉列字段 hsks(科室)、值字段 qty、聚合方式 SUM
  2. 查詢 his_mzkm_tab 獲取住院科室列表(OUTP_OR_INP='0')
  3. 動態構建 SUM(CASE ...) 列片段,拼接成 @xColumns
  4. 組裝最終動態 SQL,支持 TOP、ORDER BY、行合計 allnum
  5. 使用 sp_executesql 執行

關鍵代碼片段

SELECT @xColumns = @xColumns
+ 'SUM(CASE ' + @vColumnName + ' WHEN ''' + [a].[column] + ''' THEN ' + @vNum + ' ELSE 0 END) AS ''' + [a].[column] + ''', '
FROM (SELECT DISTINCT DEPT_NAME AS [column] FROM his_mzkm_tab WHERE OUTP_OR_INP = '0') AS a

SET @xColumns = SUBSTRING(@xColumns, 1, LEN(@xColumns)-1) -- 去尾逗號
SET @sql = 'SELECT ' + @vColumns + ', ' + @xColumns + ' FROM (...)' -- 省略子查詢

擴展建議

  • 將表名、轉列字段、值字段參數化,提升通用性
  • 加入百分比列:CAST(ROUND(SUM(CASE...)*100.0/SUM(@vNum),2) AS DECIMAL(10,2))
  • 注意動態 SQL 注入風險,業務可控場景下可接受
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved