【问题标题】:MYSQL Statement for Missed Appointments in the Last 30 Days最近 30 天错过约会的 MYSQL 语句
【发布时间】: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 的表。我已经尝试了一些变化,但没有什么能接近工作。

谢谢,我们将不胜感激。

【问题讨论】:

    标签: mysql join view insert


    【解决方案1】:

    如果条件匹配,您想使用 SUM(IF()) 和 SUM a 1。见下文。

    SELECT
      id,
      name,
      SUM(IF(DATEDIFF(CURDATE(), date) <= 30, 1, 0)) AS Last30Days,
      SUM(IF(DATEDIFF(CURDATE(), date) <= 365, 1, 0)) AS Last365Days,
      COUNT(*) AS AllTime,
      SUM(IF(DATEDIFF(CURDATE(), date) <= 30 AND outcome = 'No Show', 1, 0)) AS NoShow
     FROM
      appointments AS a
      INNER JOIN clients AS c ON a.id = c.id
     GROUP BY
      id
    

    这应该会为您提供您正在寻找的数字。 如果您想将 SELECT 转换为 INSERT,您可以执行以下操作。

    INSERT INTO apt_total
    SELECT
      id,
      name,
      SUM(IF(DATEDIFF(CURDATE(), date) <= 30, 1, 0)) AS Last30Days,
      SUM(IF(DATEDIFF(CURDATE(), date) <= 365, 1, 0)) AS Last365Days,
      COUNT(*) AS AllTime,
      SUM(IF(DATEDIFF(CURDATE(), date) <= 30 AND outcome = 'No Show', 1, 0)) AS NoShow
     FROM
      appointments AS a
      INNER JOIN clients AS c ON a.id = c.id
     GROUP BY
      id
    

    您需要确保列相同,否则您将 INSERT INTO apt_total 更改为以下内容:

    INSERT INTO apt_total (col1, col2, col3.....)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-18
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      相关资源
      最近更新 更多