我看到过一些类似这个问题的帖子。我试着使每一个都适合我的需要,但都有不足之处。希望有人能对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:如何将整个语句转换为insert语句,以便定期从视图中捕获数据。这将进入一个名为apt\u total的表中。我试过几种不同的方法,但都没有成功。
谢谢,任何帮助都将不胜感激。
1条答案
按热度按时间9vw9lbht1#
如果条件匹配,则要使用sum(if())和sum a 1。见下文。
这会给你你要找的号码。如果要将select转换为insert,可以执行以下操作。
您需要确保列是相同的,否则将insert改为apt\u total,如下所示: