This commit is contained in:
2026-07-13 11:13:27 +08:00
parent 9d52bf0c3f
commit 4bd42dd36a
12 changed files with 523 additions and 442 deletions
@@ -0,0 +1,151 @@
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