Заявление MYSQL о пропущенных встречах за последние 30 дней

0

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

Спасибо, любая помощь была бы весьма признательна.

Теги:
view
join
insert

1 ответ

0
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню