项目表
| 项目编码 | 项目名称 | 项目进度 | 项目状态 | 完成时间 |
|---|---|---|---|---|
| Pro001 | 长城贴瓷砖 | 45% | 正在执行 | NULL |
| Pro002 | 赤道镶金边 | 75% | 正在执行 | NULL |
项目执行表
| 单据号 | 当天完成总量进度(非累计) | 单据时间 | 项目编码 |
|---|---|---|---|
| P1001 | 20% | 2016-01-05 | Pro001 |
| P1002 | 25% | 2016-01-06 | Pro001 |
| P2001 | 25% | 2016-05-13 | Pro002 |
| P2002 | 50% | 2016-05-16 | Pro002 |
如果 2016-05-20 完成 ‘赤道镶金边’ 项目总进度的 25%。
1.请将该业务描述增加到项目执行表。
INSERT INTO 项目执行表
(单据号, 当天完成总量进度, 单据时间, 项目编码)
VALUES
('P2003', 25, '2016-05-20', 'Pro002');
2.更新 '赤道镶金边' 项目的最新进度。
UPDATE
项目表
SET
项目进度 = 项目进度 + 25
WHERE
项目名称 = '赤道镶金边';
3.当前 '赤道镶金边' 项目进度为 100% 时,项目状态变更为 ‘已完结’,完成时间为最新一次的项目执行时间。
UPDATE
项目表 t1
SET
项目状态 = '已完结',
完成时间 = (SELECT MAX(单据时间) FROM 项目执行表 WHERE 项目编码 = t1.项目编码)
WHERE
项目名称 = '赤道镶金边'
AND 项目进度 = 100;
4.查询 '长城贴瓷砖' 项目 2016-01-06 时当天完成进度(用项目名称作为查询条件)。
SELECT
t1.当天完成总量进度
FROM
项目执行表 t1,
项目表 t2
WHERE
t1.项目编码 = t2.项目编码
AND t1.单据时间 = '2016-01-06'
AND t2.项目名称 = '长城贴瓷砖';
补充: 对上述的第 2 小题及第 3 小题,可以提前为 '项目执行表' 定义好一个触发器,这样当新增项目执行记录时,就会自动更新 '项目表' 的项目最新进度,并对进度达到 100% 的项目设定项目状态为已完结,设定项目完成时间为最新一次的项目执行时间。
触发器: 是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。
DELIMITER $$
CREATE TRIGGER tri_项目执行表_i AFTER INSERT ON 项目执行表 FOR EACH ROW
BEGIN
UPDATE
项目表
SET
项目进度 = 项目进度 + NEW.当天完成总量进度,
项目状态 = CASE WHEN 项目进度 = 100 THEN '已完结' END,
完成时间 = CASE WHEN 项目进度 = 100 THEN (SELECT MAX(单据时间) FROM 项目执行表 WHERE 项目编码 = NEW.项目编码) END
WHERE
项目编码 = NEW.项目编码;
END $$
DELIMITER ;
友情提示: 题目来源于各家真实企业,以上回答仅供参考,不能确定是否符合出题人要考查的知识点!