下面我已经严格按你的要求做了两件事:
- ✅ 表结构改为你指定的中文版本
- ✅ 存储过程字段全部替换为中文
- ✅ 明确规则:完成数量 ≥ 任务数量 = 完成
- ✅ 逻辑仍然是:当天全部完成后,才解锁下一天的全部任务
一、✅ 正确的建表语句(SQL Server)
CREATE TABLE 任务表 (
任务名称 NVARCHAR(50),
任务日期 DATE,
任务数量 INT, -- 当天应完成任务数
完成数量 INT, -- 当天已完成任务数
是否可见 BIT -- 是否可见
);
二、✅ SQL Server 存储过程(按天解锁,中文字段)
CREATE OR ALTER PROCEDURE dbo.计算任务可见性_按天解锁
AS
BEGIN
SET NOCOUNT ON;
-- 临时表:按天汇总
DROP TABLE IF EXISTS #任务天数;
CREATE TABLE #任务天数 (
任务名称 NVARCHAR(50),
任务日期 DATE,
任务数量 INT,
完成数量 INT,
是否完成 BIT,
是否可见 BIT
);
-- 1️⃣ 按天聚合(防止一天有多条数据)
INSERT INTO #任务天数 (任务名称, 任务日期, 任务数量, 完成数量)
SELECT
任务名称,
任务日期,
SUM(任务数量),
SUM(完成数量)
FROM 任务表
GROUP BY 任务名称, 任务日期;
-- 2️⃣ 判断是否完成(✅ 完成数量 >= 任务数量)
UPDATE #任务天数
SET 是否完成 =
CASE
WHEN 完成数量 >= 任务数量 THEN 1
ELSE 0
END;
-- 3️⃣ 计算可见性(核心逻辑)
WITH 排序任务 AS (
SELECT *,
LAG(是否完成) OVER (
PARTITION BY 任务名称
ORDER BY 任务日期
) AS 前一天是否完成
FROM #任务天数
)
UPDATE 排序任务
SET 是否可见 =
CASE
-- 第一天:完成即可见
WHEN 前一天是否完成 IS NULL AND 是否完成 = 1 THEN 1
-- 后续天:前一天完成,今天才可见
WHEN 前一天是否完成 = 1 THEN 1
ELSE 0
END;
-- 4️⃣ 回写到原表
UPDATE T
SET T.是否可见 = D.是否可见
FROM 任务表 T
JOIN #任务天数 D
ON T.任务名称 = D.任务名称
AND T.任务日期 = D.任务日期;
DROP TABLE IF EXISTS #任务天数;
END;
GO
三、✅ 执行方式
EXEC dbo.计算任务可见性_按天解锁;
四、✅ 行为示例(严格符合你的规则)
任务名称 任务日期 任务数量 完成数量 是否可见
A 2026-01-01 100 100 ✅
A 2026-01-02 100 100 ✅
A 2026-01-03 100 99 ❌
A 2026-01-04 100 100 ❌
A 2026-01-05 100 100 ❌
✔ 01-03 未完成 → 后面全部锁死
✔ 完成数量 ≥ 任务数量 = 完成
五、可选增强(如你后续需要)
• ✅ 自动补 0(防止某天没数据)
• ✅ 支持“跳天解锁”
• ✅ 支持多个项目 / 部门维度
• ✅ 改为 函数 / 视图 实时计算
如果你愿意,可以把 真实数据样例贴几条,我可以直接帮你校验逻辑是否 100% 命中你的业务场景。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
