Files
JY1.0/sql/inventory_demand_performance_optimize_20260714.sql

323 lines
14 KiB
Transact-SQL

-- 库存查询需求量性能优化:直连基础表判断订单完成状态,减少重视图展开
-- 修改人:Ld 修改时间:2026-07-14 16:35:00;
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_零件基本件_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.PDM_零件明细表_基本件'))
BEGIN
CREATE NONCLUSTERED INDEX IX_Ld_零件基本件_物料组件_20260714
ON dbo.PDM_零件明细表_基本件 (物料流水号, 组件流水号)
INCLUDE (零件数量, 已领数量);
END;
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_零件标准外购_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.PDM_零件明细表_标准件和外购件'))
BEGIN
CREATE NONCLUSTERED INDEX IX_Ld_零件标准外购_物料组件_20260714
ON dbo.PDM_零件明细表_标准件和外购件 (物料流水号, 组件流水号)
INCLUDE (零件数量, 已领数量);
END;
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_临时领料_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_装配执行_临时领料明细'))
BEGIN
CREATE NONCLUSTERED INDEX IX_Ld_临时领料_物料组件_20260714
ON dbo.车间装配管理_装配执行_临时领料明细 (物料流水号, 组件流水号)
INCLUDE (实领数);
END;
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_领料明细_基本件_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_领料单明细'))
BEGIN
CREATE NONCLUSTERED INDEX IX_Ld_领料明细_基本件_20260714
ON dbo.车间装配管理_领料单明细 (基本件流水号)
INCLUDE (已领数量);
END;
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_领料明细_标准外购_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_领料单明细'))
BEGIN
CREATE NONCLUSTERED INDEX IX_Ld_领料明细_标准外购_20260714
ON dbo.车间装配管理_领料单明细 (标准件和外购件流水号)
INCLUDE (已领数量);
END;
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_领料明细_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_领料单明细'))
BEGIN
CREATE NONCLUSTERED INDEX IX_Ld_领料明细_物料组件_20260714
ON dbo.车间装配管理_领料单明细 (物料流水号, 组件流水号)
INCLUDE (已领数量);
END;
GO
ALTER VIEW dbo.物料管理_需求量_视图
AS
WITH 组件订单 AS
(
SELECT
c.组件流水号,
c.是否分配,
o.订单类型,
o.是否提交,
p.是否启用
FROM dbo.PDM_组件名称 c
INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号
INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号 = p.项目流水号
INNER JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号 = o.项目流水号
),
需求 AS
(
SELECT b.物料流水号, SUM(ISNULL(b.零件数量, 0)) AS 需求量
FROM dbo.PDM_零件明细表_基本件 b
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
WHERE co.是否分配 = 1
AND co.订单类型 <> 3
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 直接用基础字段排除已完成订单
GROUP BY b.物料流水号
UNION ALL
SELECT s.物料流水号, SUM(ISNULL(s.零件数量, 0)) AS 需求量
FROM dbo.PDM_零件明细表_标准件和外购件 s
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
WHERE co.是否分配 = 1
AND co.订单类型 <> 3
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 直接用基础字段排除已完成订单
GROUP BY s.物料流水号
UNION ALL
SELECT t.物料流水号, SUM(ISNULL(t.实领数, 0)) AS 需求量
FROM dbo.车间装配管理_装配执行_临时领料明细 t
LEFT JOIN 组件订单 co ON t.组件流水号 = co.组件流水号
WHERE t.物料流水号 IS NOT NULL
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时领料同口径排除已完成订单
GROUP BY t.物料流水号
),
需求汇总 AS
(
SELECT 物料流水号, SUM(需求量) AS 需求量
FROM 需求
GROUP BY 物料流水号
),
已领 AS
(
SELECT b.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
FROM dbo.车间装配管理_领料单明细 l
INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号 = b.基本件流水号
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 扣减已领数时同步排除已完成订单
GROUP BY b.物料流水号
UNION ALL
SELECT s.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
FROM dbo.车间装配管理_领料单明细 l
INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号 = s.标准件和外购件流水号
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 扣减已领数时同步排除已完成订单
GROUP BY s.物料流水号
UNION ALL
SELECT l.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
FROM dbo.车间装配管理_领料单明细 l
LEFT JOIN 组件订单 co ON l.组件流水号 = co.组件流水号
WHERE l.物料流水号 IS NOT NULL
AND ISNULL(l.物料流水号, 0) <> 0
AND ISNULL(l.基本件流水号, 0) = 0
AND ISNULL(l.标准件和外购件流水号, 0) = 0
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时件扣减已领数时同步排除已完成订单
GROUP BY l.物料流水号
),
已领汇总 AS
(
SELECT 物料流水号, SUM(已领数) AS 已领数
FROM 已领
GROUP BY 物料流水号
)
SELECT
d.物料流水号,
CASE WHEN d.需求量 > ISNULL(l.已领数, 0) THEN d.需求量 - ISNULL(l.已领数, 0) ELSE 0 END AS 需求量
FROM 需求汇总 d
LEFT JOIN 已领汇总 l ON d.物料流水号 = l.物料流水号;
GO
ALTER PROCEDURE [dbo].[物料管理_需求量_更新]
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM dbo.物料管理_需求量;
INSERT INTO dbo.物料管理_需求量
SELECT 物料流水号, 需求量
FROM dbo.物料管理_需求量_视图
WHERE 需求量 > 0;
END;
GO
ALTER PROCEDURE [dbo].[仓储管理_报缺补货_需求量明细_查询]
@物料流水号 INT = 15448
AS
BEGIN
SET NOCOUNT ON;
;WITH 组件订单 AS
(
SELECT
c.组件流水号,
o.订单编号,
c.是否分配,
o.订单类型,
o.是否提交,
p.是否启用,
ISNULL(k.简称, '') AS 简称
FROM dbo.PDM_组件名称 c
INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号
INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号 = p.项目流水号
INNER JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号 = o.项目流水号
LEFT JOIN dbo.客户关系管理系统_客户名称 k ON p.客户流水号 = k.客户流水号
),
需求明细 AS
(
SELECT
co.订单编号,
b.组件流水号,
b.物料流水号,
SUM(ISNULL(b.零件数量, 0)) AS 需求量,
N'生产订单需求' AS 来源
FROM dbo.PDM_零件明细表_基本件 b
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
WHERE co.是否分配 = 1
AND co.订单类型 <> 3
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细不显示已完成订单
AND (@物料流水号 IS NULL OR b.物料流水号 = @物料流水号)
GROUP BY co.订单编号, b.组件流水号, b.物料流水号
UNION ALL
SELECT
co.订单编号,
s.组件流水号,
s.物料流水号,
SUM(ISNULL(s.零件数量, 0)) AS 需求量,
N'生产订单需求' AS 来源
FROM dbo.PDM_零件明细表_标准件和外购件 s
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
WHERE co.是否分配 = 1
AND co.订单类型 <> 3
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细不显示已完成订单
AND (@物料流水号 IS NULL OR s.物料流水号 = @物料流水号)
GROUP BY co.订单编号, s.组件流水号, s.物料流水号
UNION ALL
SELECT
co.订单编号,
t.组件流水号,
t.物料流水号,
SUM(ISNULL(t.实领数, 0)) AS 需求量,
N'临时领料需求' AS 来源
FROM dbo.车间装配管理_装配执行_临时领料明细 t
LEFT JOIN 组件订单 co ON t.组件流水号 = co.组件流水号
WHERE t.物料流水号 IS NOT NULL
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时领料明细不显示已完成订单
AND (@物料流水号 IS NULL OR t.物料流水号 = @物料流水号)
GROUP BY co.订单编号, t.组件流水号, t.物料流水号
),
已领明细 AS
(
SELECT
co.订单编号,
b.组件流水号,
b.物料流水号,
SUM(ISNULL(l.已领数量, 0)) AS 已领数
FROM dbo.车间装配管理_领料单明细 l
INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号 = b.基本件流水号
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细扣减已领数时同步排除已完成订单
AND (@物料流水号 IS NULL OR b.物料流水号 = @物料流水号)
GROUP BY co.订单编号, b.组件流水号, b.物料流水号
UNION ALL
SELECT
co.订单编号,
s.组件流水号,
s.物料流水号,
SUM(ISNULL(l.已领数量, 0)) AS 已领数
FROM dbo.车间装配管理_领料单明细 l
INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号 = s.标准件和外购件流水号
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细扣减已领数时同步排除已完成订单
AND (@物料流水号 IS NULL OR s.物料流水号 = @物料流水号)
GROUP BY co.订单编号, s.组件流水号, s.物料流水号
UNION ALL
SELECT
co.订单编号,
l.组件流水号,
l.物料流水号,
SUM(ISNULL(l.已领数量, 0)) AS 已领数
FROM dbo.车间装配管理_领料单明细 l
LEFT JOIN 组件订单 co ON l.组件流水号 = co.组件流水号
WHERE l.物料流水号 IS NOT NULL
AND ISNULL(l.物料流水号, 0) <> 0
AND ISNULL(l.基本件流水号, 0) = 0
AND ISNULL(l.标准件和外购件流水号, 0) = 0
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时件明细扣减已领数时同步排除已完成订单
AND (@物料流水号 IS NULL OR l.物料流水号 = @物料流水号)
GROUP BY co.订单编号, l.组件流水号, l.物料流水号
),
已领汇总 AS
(
SELECT 订单编号, 组件流水号, 物料流水号, SUM(已领数) AS 已领数
FROM 已领明细
GROUP BY 订单编号, 组件流水号, 物料流水号
),
明细 AS
(
SELECT
d.订单编号,
d.组件流水号,
d.物料流水号,
d.需求量,
ISNULL(l.已领数, 0) AS 已领数,
CASE WHEN d.需求量 > ISNULL(l.已领数, 0) THEN d.需求量 - ISNULL(l.已领数, 0) ELSE 0 END AS 最终需求量,
d.来源
FROM 需求明细 d
LEFT JOIN 已领汇总 l
ON d.物料流水号 = l.物料流水号
AND d.组件流水号 = l.组件流水号
AND ISNULL(d.订单编号, '') = ISNULL(l.订单编号, '')
)
SELECT
d.订单编号,
d.组件流水号,
d.物料流水号,
d.需求量,
d.已领数,
d.最终需求量,
ISNULL(co.简称, '') AS 简称,
d.来源
FROM 明细 d
LEFT JOIN 组件订单 co ON d.组件流水号 = co.组件流水号
ORDER BY d.订单编号, d.组件流水号, d.来源;
;WITH 汇总 AS
(
SELECT 物料流水号, 需求量
FROM dbo.物料管理_需求量_视图
WHERE (@物料流水号 IS NULL OR 物料流水号 = @物料流水号)
)
SELECT
物料流水号,
需求量 AS 总需求量,
0 AS 总已领数,
需求量 AS 总最终需求量
FROM 汇总
ORDER BY 物料流水号;
END;
GO