Заявление MYSQL о пропущенных встречах за последние 30 дней - PullRequest
0 голосов
/ 27 июня 2018

Я видел несколько постов, похожих на этот вопрос. Я пытался адаптировать каждый из них к своим потребностям, но я потерпел неудачу. Надеюсь, кто-то может оказать некоторую помощь с этим утверждением 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. Я попробовал несколько вариантов, но ничто не приблизилось к работе.

Спасибо, любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 27 июня 2018

Вы хотите использовать 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.....)
...