報表開發中常遇到「行轉列」需求:將垂直分布的類別值(如科室、產品)轉為水平列顯示。本文提供一個通用存儲過程 Model_his_mid,支持動態列生成、條件篩選、排序、Top N 及行合計。
| 參數 | 說明 |
|---|---|
| @vColumns | 分組列(如就診日期、醫生),最後一列後不加逗號 |
| @vClause | WHERE 條件(無條件傳空串) |
| @vOrderby | 結果排序字段(空則默認) |
| @vTop | 返回行數(空則全部) |
his_mid_tab、轉列字段 hsks(科室)、值字段 qty、聚合方式 SUMhis_mzkm_tab 獲取住院科室列表(OUTP_OR_INP='0')SUM(CASE ...) 列片段,拼接成 @xColumnsTOP、ORDER BY、行合計 allnumsp_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))