Create PROC GuoCiTJ
(@starttime VARCHAR(20), @endtime VARCHAR(20))
AS
BEGIN
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
-- 构建动态列名
SELECT @columns = COALESCE(@columns + ',','') +QUOTENAME(XiaoDuGMC)
FROM (SELECT DISTINCT XiaoDuGMC FROM T_Xiao ) A
-- 构建动态 SQL
SET @sql = N'
WITH ta AS (
--数据源
SELECT guo , XiaoDuGMC FROM T_souce
)
--将XiaoDuGMC列里面的数据改为 数据集的字段名, 列 guo 变为数据
SELECT *
FROM ta
PIVOT (
SUM(guo)
FOR XiaoDuGMC IN (' + @columns + ')
) AS PivotData';
-- 执行动态 SQL
EXEC sp_executesql @sql, N'@starttime VARCHAR(20), @endtime VARCHAR(20)', @starttime, @endtime;
END
GO
函数说明: 对数据表中的数据处理, 即有字段 guo, xiaodumc 表., 查询出来guo , xiaodumc 两列数据.
因为xiaodumc 里面的数据是动态的, 所以先查询出来 xiaodumc 所有的值(或根据where条件)
然后使用
SELECT *
FROM ta
PIVOT (
SUM(guo)
FOR XiaoDuGMC IN (' + @columns + ')
) AS PivotData';
sum(guo) 是要进行分组合计 或 count 使用聚合函数.
For XiaoDuGMC 是将要显示的列
IN (' + @columns + ') 显示字段名集合,如果提前知道将要显示的列名 可以使用 IN ([数学],[语文]) ,
如果@columns 变为列时 , 显示的数据可能有空值,记得转换.