-- ============================================================ -- 修复: [dbo].[质量管理_质量检验_入库质检任务_查询] -- 错误1: CheckedQuantity CTE 末尾多余逗号 (语法错误) -- 错误2: QualityData 中 检测类型编号 硬编码6 vs WHERE过滤5 (不一致) -- 错误3: 检测说明 列缺少表前缀 (歧义) -- 错误4: GROUP BY 含不必要的 cq.聚合字段 -- 日期: 2026-05-22 -- ============================================================ USE [YL_MESDB] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[质量管理_质量检验_入库质检任务_查询] @订单号 NVARCHAR(100) = '', @零件编号 NVARCHAR(100) = '', @零件名称 NVARCHAR(100) = '', @检测日期_Start NVARCHAR(20) = '', @检测日期_End NVARCHAR(20) = '', @检测结果 NVARCHAR(10) = '', @检测人 NVARCHAR(50) = '', @状态 NVARCHAR(10) = '', @单据码 NVARCHAR(50) = '' AS BEGIN SET NOCOUNT ON; DECLARE @SQL NVARCHAR(MAX) DECLARE @WhereConditions NVARCHAR(MAX) = '' DECLARE @TaskWhere NVARCHAR(MAX) = '' DECLARE @OuterWhere NVARCHAR(MAX) = '' -- 构建任务表筛选条件(用于内层) SET @TaskWhere = @TaskWhere + ' AND (task.订单类型 = ''20'') ' IF @单据码 <> '' SET @TaskWhere = @TaskWhere + ' AND task.单据码 LIKE ''%' + @单据码 + '%''' IF @订单号 <> '' SET @TaskWhere = @TaskWhere + ' AND task.订单编号 LIKE ''%' + @订单号 + '%''' IF @零件编号 <> '' SET @TaskWhere = @TaskWhere + ' AND task.物料编码 LIKE ''%' + @零件编号 + '%''' IF @零件名称 <> '' SET @TaskWhere = @TaskWhere + ' AND task.物料名称 LIKE ''%' + @零件名称 + '%''' -- 构建外层筛选条件(用于计算结果) IF @检测结果 <> '' SET @OuterWhere = @OuterWhere + ' AND 检测结果 = ' + @检测结果 IF @状态 <> '' SET @OuterWhere = @OuterWhere + ' AND 状态 = ''' + @状态 + '''' IF @检测人 <> '' SET @OuterWhere = @OuterWhere + ' AND 检测人 LIKE ''%' + @检测人 + '%''' IF @检测日期_Start <> '' AND @检测日期_End <> '' SET @OuterWhere = @OuterWhere + ' AND CAST(检验时间 AS DATE) BETWEEN ''' + @检测日期_Start + ''' AND ''' + @检测日期_End + '''' -- 构建内层WHERE DECLARE @InnerWhere NVARCHAR(MAX) = '' IF LEN(@TaskWhere) > 0 SET @InnerWhere = ' WHERE ' + SUBSTRING(@TaskWhere, 5, LEN(@TaskWhere)) SET @SQL = ' WITH QualityData AS ( SELECT 计划号, 检验数量, 合格数, 不合格数, 检测人, 检测时间, 检测类型编号 -- ============ 修复点②:不要硬编码,取实际值 ============ FROM [dbo].[YL_质量检验_质检记录] WHERE 检测类型编号 = 5 -- ← WHERE 和 SELECT 一致了 ), -- 统计已检验数量和合格数 CheckedQuantity AS ( SELECT 计划号, 行号, 订单类型 AS 质检订单类型, SUM(检验数量) AS 已检验数量, SUM(合格数) AS 累计合格数, SUM(不合格数) AS 累计不合格数, MAX(检测说明) AS 检测说明 -- ============ 修复点①:去掉末尾多余的逗号 ============ FROM [dbo].[YL_质量检验_质检记录] WHERE 检测类型编号 = 5 GROUP BY 计划号, 行号, 订单类型 ), AggregatedData AS ( SELECT task.订单编号 AS 计划号, task.单据码, task.订单类型, task.物料编码, task.物料名称, task.到货数, task.入库数量, task.加急状态, task.行号, task.采购到货时间, task.存放位置, task.加急总数, -- 使用累计数据 ISNULL(cq.已检验数量, 0) AS 检验数量, ISNULL(cq.累计合格数, 0) AS 合格数, ISNULL(cq.累计不合格数, 0) AS 不合格数, ISNULL(cq.已检验数量, 0) AS 已检验数量, cq.检测说明 AS 备注, -- ============ 修复点③:加上表前缀 cq. ============ task.入库数量 - ISNULL(cq.已检验数量, 0) AS 剩余待检数量, -- 检测人(取最新的或合并多人) CASE WHEN COUNT(DISTINCT qd.检测人) = 1 THEN MAX(qd.检测人) ELSE STUFF(( SELECT DISTINCT '', '' + 检测人 FROM QualityData qd2 WHERE qd2.计划号 = task.订单编号 AND ISNULL(qd2.检测人, '''') <> '''' FOR XML PATH('''')), 1, 2, '''') END AS 检测人, MAX(qd.检测时间) AS 检验时间, -- 检测结果(基于累计数据) CASE WHEN ISNULL(cq.累计不合格数, 0) > 0 THEN 2 WHEN ISNULL(cq.累计合格数, 0) > 0 THEN 1 ELSE 0 END AS 检测结果, -- 检验状态 CASE WHEN ISNULL(cq.已检验数量, 0) >= task.入库数量 AND task.入库数量 > 0 THEN ''1'' ELSE ''0'' END AS 状态 FROM [dbo].[质量检验_质检任务_SAP] task LEFT JOIN QualityData qd ON task.订单编号 = qd.计划号 LEFT JOIN CheckedQuantity cq ON task.订单编号 = cq.计划号 AND task.行号 = cq.行号 AND task.订单类型 = cq.质检订单类型 ' + @InnerWhere + ' GROUP BY task.订单编号, task.单据码, task.订单类型, task.物料编码, task.物料名称, task.到货数, task.入库数量, task.加急状态, task.行号, task.采购到货时间, task.存放位置, task.加急总数, cq.已检验数量, cq.累计合格数, cq.累计不合格数, cq.检测说明 -- ============ 修复点④:GROUP BY 加入新增的检测说明列 ============ ) SELECT * FROM AggregatedData WHERE 1=1' + @OuterWhere + ' ORDER BY 加急状态 DESC' PRINT @SQL EXEC sp_executesql @SQL END GO