第一种
SELECT title,
SUM(CASE typeid WHEN '1' THEN gjdate ELSE 0 END) AS '调休',
SUM(CASE typeid WHEN '2' THEN gjdate ELSE 0 END) AS '请假',
SUM(CASE typeid WHEN '3' THEN gjdate ELSE 0 END) AS '加班'
FROM lfil_tb
GROUP BY title
第二种
DECLARE @sql_str NVARCHAR(MAX) DECLARE @sql_col NVARCHAR(MAX) DECLARE @tableName SYSNAME -- 表名 DECLARE @groupColumn SYSNAME -- 分组字段(title name 什么玩意的) DECLARE @row2column SYSNAME -- 行转列的字段 DECLARE @row2columnValue SYSNAME -- 行变列值的字段 SET @tableName = ' lfil_tb ' SET @groupColumn = ' title ' SET @row2column = ' typeid ' SET @row2columnValue = ' gjdate ' -- 从行数据中获取可能存在的列 SET @sql_str = N ' SELECT @sql_col_out = ISNULL(@sql_col_out + '' , '' , '''' ) + QUOTENAME([ ' +@row2column+ ' ]) FROM [ ' +@tableName+ ' ] GROUP BY [ ' +@row2column+ ' ] ' -- PRINT @sql_str EXEC sp_executesql @sql_str,N ' @sql_col_out NVARCHAR(MAX) OUTPUT ' ,@sql_col_out= @sql_col OUTPUT -- PRINT @sql_col SET @sql_str = N ' SELECT * FROM ( SELECT [ ' +@groupColumn+ ' ],[ ' +@row2column+ ' ],[ ' +@row2columnValue+ ' ] FROM [ ' +@tableName+ ' ]) p PIVOT (SUM([ ' +@row2columnValue+ ' ]) FOR [ ' +@row2column+ ' ] IN ( ' + @sql_col + ' ) ) AS pvt ORDER BY pvt.[ ' +@groupColumn+ ' ] ' -- PRINT (@sql_str) EXEC (@sql_str)