152 lines
5.0 KiB
Transact-SQL
152 lines
5.0 KiB
Transact-SQL
|
|
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
|
|
|
|
|