ALTER PROCEDURE [dbo].[Sp_WeekWelding] ( @StartWeldingDate DATETIME, @EndWeldingDate DATETIME, @WelderCode NVARCHAR(20) = NULL ) AS BEGIN SET NOCOUNT ON; DECLARE @Sql NVARCHAR(MAX) DECLARE @ColList NVARCHAR(MAX) = '' DECLARE @ColNameList NVARCHAR(MAX) = '' DECLARE @FinalDateCols NVARCHAR(MAX) = '' ;WITH DateCalendar AS ( SELECT CAST(@StartWeldingDate AS DATE) AS WeldDay UNION ALL SELECT DATEADD(DAY, 1, WeldDay) FROM DateCalendar WHERE WeldDay < CAST(@EndWeldingDate AS DATE) ) SELECT @ColList += ISNULL(',[' + CONVERT(VARCHAR, WeldDay, 23) + ']',''), @ColNameList += ISNULL(',ISNULL([' + CONVERT(VARCHAR, WeldDay, 23) + '],0) AS [' + CONVERT(VARCHAR, WeldDay, 23) + ']',''), @FinalDateCols += ISNULL(',t.[' + CONVERT(VARCHAR, WeldDay, 23) + ']','') FROM DateCalendar ORDER BY WeldDay SET @ColList = STUFF(@ColList,1,1,'') SET @ColNameList = STUFF(@ColNameList,1,1,'') SET @FinalDateCols = STUFF(@FinalDateCols,1,1,'') -- 动态行转列SQL SET @Sql = N' WITH DailyDataAll AS ( SELECT welder.WED_Code AS WelderCode, CONVERT(DATE, daily.JOT_WeldDate) AS WeldDay, SUM(ISNULL(jot.JOT_DoneDin, 0)) AS DailyWeldingSize FROM HJGL_PW_JointInfo jot LEFT JOIN dbo.HJGL_PW_IsoInfo pipe ON pipe.ISO_ID = jot.ISO_ID LEFT JOIN HJGL_BO_WeldReportMain daily ON jot.DReportID = daily.DReportID LEFT JOIN dbo.HJGL_BS_Welder welder ON welder.WED_ID = jot.JOT_FloorWelder WHERE daily.JOT_WeldDate >= @StartWeldingDate AND daily.JOT_WeldDate < DATEADD(DAY, 1, @EndWeldingDate) AND jot.JOT_Size <> jot.JOT_DoneDin AND (@WelderCode IS NULL OR welder.WED_Code = @WelderCode) GROUP BY welder.WED_Code, CONVERT(DATE, daily.JOT_WeldDate) ), FilterWelder AS ( SELECT DISTINCT WelderCode FROM DailyDataAll WHERE DailyWeldingSize > 40 ), DailyData AS ( SELECT a.* FROM DailyDataAll a INNER JOIN FilterWelder f ON a.WelderCode = f.WelderCode ) SELECT pvt.WelderCode, ' + @ColNameList + ' FROM DailyData PIVOT ( SUM(DailyWeldingSize) FOR WeldDay IN (' + @ColList + ') ) pvt ORDER BY pvt.WelderCode; ' -- 临时表:只保留焊工号 CREATE TABLE #TempResult ( WelderCode NVARCHAR(50) ); DECLARE @AddColSql NVARCHAR(MAX) = '' ;WITH DateCalendar AS ( SELECT CAST(@StartWeldingDate AS DATE) AS WeldDay UNION ALL SELECT DATEADD(DAY, 1, WeldDay) FROM DateCalendar WHERE WeldDay < CAST(@EndWeldingDate AS DATE) ) SELECT @AddColSql += 'ALTER TABLE #TempResult ADD [' + CONVERT(VARCHAR, WeldDay, 23) + '] FLOAT DEFAULT 0;' FROM DateCalendar ORDER BY WeldDay EXEC(@AddColSql); -- 执行动态PIVOT写入临时表 INSERT INTO #TempResult EXEC sp_executesql @Sql, N'@StartWeldingDate DATETIME,@EndWeldingDate DATETIME,@WelderCode NVARCHAR(20)', @StartWeldingDate,@EndWeldingDate,@WelderCode; -- 查询焊工项目名称 CREATE TABLE #WelderProject ( WelderCode NVARCHAR(50), ProjectNames NVARCHAR(MAX) ); INSERT INTO #WelderProject(WelderCode,ProjectNames) SELECT DISTINCT welder.WED_Code, ISNULL(STUFF(( SELECT DISTINCT ',' + proj.ProjectCode FROM HJGL_PW_JointInfo jot2 LEFT JOIN HJGL_PW_IsoInfo pipe2 ON pipe2.ISO_ID = jot2.ISO_ID LEFT JOIN dbo.Base_Project proj ON proj.ProjectId = pipe2.ProjectId LEFT JOIN HJGL_BO_WeldReportMain daily2 ON jot2.DReportID = daily2.DReportID LEFT JOIN dbo.HJGL_BS_Welder welder2 ON welder2.WED_ID = jot2.JOT_FloorWelder WHERE welder2.WED_Code = welder.WED_Code AND daily2.JOT_WeldDate >= @StartWeldingDate AND daily2.JOT_WeldDate < DATEADD(DAY, 1, @EndWeldingDate) AND jot2.JOT_Size <> jot2.JOT_DoneDin FOR XML PATH(''), TYPE ).value('.','NVARCHAR(MAX)'),1,1,''),'') AS ProjectNames FROM HJGL_PW_JointInfo jot LEFT JOIN dbo.HJGL_PW_IsoInfo pipe ON pipe.ISO_ID = jot.ISO_ID LEFT JOIN HJGL_BO_WeldReportMain daily ON jot.DReportID = daily.DReportID LEFT JOIN dbo.HJGL_BS_Welder welder ON welder.WED_ID = jot.JOT_FloorWelder WHERE daily.JOT_WeldDate >= @StartWeldingDate AND daily.JOT_WeldDate < DATEADD(DAY, 1, @EndWeldingDate) AND jot.JOT_Size <> jot.JOT_DoneDin AND (@WelderCode IS NULL OR welder.WED_Code = @WelderCode); -- 动态拼接最终输出SQL DECLARE @FinalSql NVARCHAR(MAX) = N' SELECT t.WelderCode, wp.ProjectNames, ' + @FinalDateCols + ' FROM #TempResult t INNER JOIN #WelderProject wp ON t.WelderCode = wp.WelderCode ORDER BY t.WelderCode; ' EXEC(@FinalSql); -- 清理临时表 DROP TABLE IF EXISTS #TempResult; DROP TABLE IF EXISTS #WelderProject; END GO