20260713
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user