【发布时间】:2018-12-06 18:28:54
【问题描述】:
我看过一些类似这个问题的帖子。我尝试过调整每一个以适应我的需要,但我做得不够。希望有人可以为这个mysql语句提供一些帮助:
父表:客户端
`id` int(11) NOT NULL AUTO_INCREMENT,
子表:约会
CREATE TABLE `appointment` (
`aptID` int(11) NOT NULL AUTO_INCREMENT,
`start_time` time DEFAULT NULL,
`date` date DEFAULT NULL,
`id` int(11) DEFAULT NULL,
`reason` enum('Assessment','Follow-up') DEFAULT NULL,
`outcome` enum('Show','No Show') DEFAULT NULL,
`last30` int(5) DEFAULT NULL,
PRIMARY KEY (`aptID`),
KEY `fk_appointment_client1_idx` (`id`),
CONSTRAINT `fk_appointment_client1` FOREIGN KEY (`id`) REFERENCES `client` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8;
我需要以下报告:
1) 过去 30 天内的约会次数 2) 365 天内的约会次数 3) 约会次数 4) 过去 30 天内的错过约会次数
我创建了一个视图,它提供了除最后一个(错过的约会)之外的所有内容,但我不知道如何合并错过的约会:
CREATE VIEW `total`
AS SELECT
id AS id,
name AS name,
count(`C1`) AS `Last30days`,
count(.`C2`) AS `Last365Days`,
count(`C3`) AS `Alltime`
FROM (select
client.id AS id,
client.name AS name,
(CASE WHEN DATEDIFF(CURDATE(), date) <= 30 THEN NULL end) AS `C1`,
(CASE WHEN DATEDIFF(CURDATE(), date) <= 365 THEN NULL end) AS `C2`,
(select count(*) from appointment where id=client.id) as `C3`
from
(client left join appointment on((client.id = appointment.id))))
group by `total`.`id`;
问题 1:如何将过去 30 天内的错过约会纳入此视图?错过的约会将作为过去 30 天内的约会进行操作,结果变量为“未出现”。我认为可以通过添加这两行:
count(`C4`) AS `Missed30`
(CASE WHEN DATEDIFF(CURDATE(), date) <= 365 where outcome = 'No Show' THEN NULL end) AS `C4`
问题 2: 如何将整个语句转换为插入语句以定期从视图中捕获数据。这将进入一个名为 apt_total 的表。我已经尝试了一些变化,但没有什么能接近工作。
谢谢,我们将不胜感激。
【问题讨论】: