WITH ProcessCount AS (
-- 步骤1: 计算每个线组/节拍的工序数量
SELECT
线组,
生产节拍,
COUNT(DISTINCT 工序) AS 工序数量
FROM [dbo].[ods_TPS作业组合表]
WHERE
要素时间 <> '0'
AND LEFT(年月,7) = '${年月}'
AND 产线 = '${产线}'
AND 线组 = '${线组}'
AND 生产节拍 = '${TT}'
GROUP BY 线组, 生产节拍
),
BaseData AS (
-- 步骤2: 原始查询逻辑
SELECT
id,
年月,
t.线组,
工序,
作业要素,
要素时间,
COALESCE(SUM(CAST(要素时间 AS INT)) OVER (
PARTITION BY t.线组, 工序, 生产节拍
ORDER BY 要素顺序
ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING
), 0) AS 累计要素时间,
CASE WHEN 自动时间 > 0 THEN 100 ELSE NULL END AS 自动目标要素时间,
CASE WHEN 作业类型 = '步行作业' OR 作业要素 LIKE '%步行%' THEN 100 ELSE NULL END AS 步行目标要素时间,
自动时间,
作业类型,
CONVERT(INT, 生产节拍) AS 生产节拍,
CASE
WHEN ROW_NUMBER() OVER (
PARTITION BY t.线组, 工序, 生产节拍
ORDER BY 要素顺序 DESC
) = 1 THEN
CONVERT(INT, 生产节拍)
- COALESCE(SUM(CONVERT(INT, 要素时间)) OVER (
PARTITION BY t.线组, 工序, 生产节拍
ORDER BY 要素顺序
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
), 0)
- CONVERT(INT, 要素时间)
ELSE NULL
END AS 差距时间,
CONVERT(INT, 要素顺序) AS 要素顺序,
改善类型,
产线,
机型分类,
机型,
t.生产节拍 AS 生产节拍原始值 -- 保留原始值用于连接
FROM [dbo].[ods_TPS作业组合表] t
WHERE
要素时间 <> '0'
AND LEFT(年月,7) = '${年月}'
AND 产线 = '${产线}'
AND t.线组 = '${线组}'
AND t.生产节拍 = '${TT}'
)
-- 步骤3: 添加动态换行处理
SELECT
id,
年月,
线组,
工序,
-- 动态换行逻辑
CONCAT(
CAST(要素顺序 AS VARCHAR),
'-',
CASE
-- 根据工序数量设置不同换行规则
WHEN pc.工序数量 <= 16 AND LEN(作业要素) > 10 THEN
SUBSTRING(作业要素, 1, 10) + CHAR(10) + SUBSTRING(作业要素, 11, LEN(作业要素))
WHEN pc.工序数量 > 16 AND pc.工序数量 <= 20 AND LEN(作业要素) > 6 THEN
SUBSTRING(作业要素, 1, 6) + CHAR(10) + SUBSTRING(作业要素, 7, LEN(作业要素))
WHEN pc.工序数量 > 20 AND LEN(作业要素) > 5 THEN
SUBSTRING(作业要素, 1, 5) + CHAR(10) + SUBSTRING(作业要素, 6, LEN(作业要素))
ELSE
作业要素
END
) AS 作业要素,
要素时间,
累计要素时间,
自动目标要素时间,
步行目标要素时间,
自动时间,
作业类型,
生产节拍,
差距时间,
要素顺序,
改善类型,
产线,
机型分类,
机型
FROM BaseData bd
INNER JOIN ProcessCount pc
ON bd.线组 = pc.线组
AND bd.生产节拍原始值 = pc.生产节拍 -- 使用原始值匹配
ORDER BY
要素顺序,
CASE
WHEN 工序 LIKE '[0-9][0-9]%' OR 工序 LIKE '[0-9][^0-9]%' OR 工序 LIKE '[0-9]' THEN
CAST(LEFT(工序, PATINDEX('%[^0-9]%', 工序 + ' ') - 1) AS INT)
END;
最新发布