Добавить строку в результат запроса, если какая-либо дата отсутствует в диапазоне SQL - PullRequest
0 голосов
/ 27 февраля 2020

Я новичок в SQL и хочу добавить строку в результат запроса между диапазонами дат, если между диапазонами дат отсутствует какая-либо дата.

Вот мой запрос

SELECT CHECKINOUT.USERID, USERINFO.USERID,
        CAST(CHECKTIME AS DATE) DATE,
        MAX(CAST(CHECKTIME AS TIME)) as MAX_TIME,
        MIN(CAST(CHECKTIME AS TIME)) as MIN_TIME
        FROM CHECKINOUT
        LEFT JOIN USERINFO
        ON CHECKINOUT.USERID = USERINFO.USERID
        WHERE CHECKTIME BETWEEN '2020-02-01' AND '2020-02-10'
        GROUP BY CHECKINOUT.USERID,CAST(CHECKTIME AS DATE), USERINFO.USERID, USERINFO.NAME
         ORDER by CAST(CHECKTIME AS DATE), USERINFO.NAME ASC

Вывод этого запроса

USERID  USERID  DATE    MAX_TIME    MIN_TIME
59  59  2/3/2020    4:11:48 PM  8:47:02 AM
59  59  2/4/2020    6:22:38 PM  8:45:50 AM
59  59  2/6/2020    2:33:43 PM  1:57:55 PM
59  59  2/7/2020    4:29:40 PM  8:39:38 AM
60  60  2/3/2020    4:11:48 PM  8:47:02 AM
60  60  2/4/2020    6:22:38 PM  8:45:50 AM
60  60  2/6/2020    2:33:43 PM  1:57:55 PM
60  60  2/7/2020    4:29:40 PM  8:39:38 AM
61  61  2/3/2020    4:11:48 PM  8:47:02 AM
61  61  2/4/2020    6:22:38 PM  8:45:50 AM
61  61  2/6/2020    2:33:43 PM  1:57:55 PM
61  61  2/7/2020    4:29:40 PM  8:39:38 AM

И мой ожидаемый вывод

    USERID  USERID  DATE    MAX_TIME    MIN_TIME
59  59  2/1/2020    NULL    NULL
59  59  2/2/2020    NULL    NULL
59  59  2/3/2020    4:11:48 PM  8:47:02 AM
59  59  2/4/2020    6:22:38 PM  8:45:50 AM
59  59  2/6/2020    2:33:43 PM  1:57:55 PM
59  59  2/7/2020    4:29:40 PM  8:39:38 AM
59  59  2/8/2020    NULL    NULL
59  59  2/9/2020    NULL    NULL
59  59  2/10/2020   NULL    NULL
60  60  2/1/2020    NULL    NULL
60  60  2/2/2020    NULL    NULL
60  60  2/3/2020    4:11:48 PM  8:47:02 AM
60  60  2/4/2020    6:22:38 PM  8:45:50 AM
60  60  2/6/2020    2:33:43 PM  1:57:55 PM
60  60  2/7/2020    4:29:40 PM  8:39:38 AM
60  60  2/8/2020    NULL    NULL
60  60  2/9/2020    NULL    NULL
60  60  2/10/2020   NULL    NULL
61  61  2/1/2020    NULL    NULL
61  61  2/2/2020    NULL    NULL
61  61  2/3/2020    4:11:48 PM  8:47:02 AM
61  61  2/4/2020    6:22:38 PM  8:45:50 AM
61  61  2/6/2020    2:33:43 PM  1:57:55 PM
61  61  2/7/2020    4:29:40 PM  8:39:38 AM
61  61  2/8/2020    NULL    NULL
61  61  2/9/2020    NULL    NULL
61  61  2/10/2020   NULL    NULL

Может ли кто-нибудь помочь мне?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Вам необходимо сформировать список дат. Вы можете сделать это несколькими способами:

  • Явно.
  • Использование таблицы чисел / подсчета / календаря.
  • Использование рекурсивного CTE.

Затем используйте CROSS JOIN для генерации нужных вам строк. И, наконец, LEFT JOIN для ввода данных, которые вы уже рассчитали.

Вот пример:

WITH uc AS (
      SELECT c.USERID, CAST(CHECKTIME AS DATE) as DATE,
             MAX(CAST(CHECKTIME AS TIME)) as MAX_TIME,
             MIN(CAST(CHECKTIME AS TIME)) as MIN_TIME
      FROM CHECKINOUT c LEFT JOIN
           USERINFO u 
           ON i.USERID = u.USERID
      WHERE c.CHECKTIME BETWEEN '2020-02-01' AND '2020-02-10'
      GROUP BY c.USERID, CAST(CHECKTIME AS DATE), u.USERID, u.NAME
     )
SELECT u.USERID, d.dte, uc.min_time, uc.max_time
FROM (SELECT DISTINCT USERID FROM uc) u CROSS JOIN
     (SELECT CAST('2020-02-01' as DATE) as dte UNION ALL
      SELECT CAST('2020-02-02' as DATE) as dte UNION ALL
      . . .
      SELECT CAST('2020-02-10' as DATE) as dte UNION ALL
     ) d LEFT JOIN
     cu
     ON cu.USERID = u.USERID AND cu.DATE = d.dte
ORDER by d.dte, NAME ASC
0 голосов
/ 27 февраля 2020

Mysql не может сам возвращать строки для несуществующих данных, вы должны сами его обойти, создавая эти пустые строки.

У меня такой же вопрос , вы можете обратиться к этот ответ для достижения того, что вы ищете.

TLDR

В основном вы используете таблицу с достаточным количеством строк, чтобы указать необходимое количество пустых строк (ответ Приведенное выше использование information_schema.columns) в сочетании с переменной генерирует строки с инкрементным значением (m,...,n), затем вы можете использовать эти строки и эти значения для генерации недостающих данных, которые вам нужны, например даты для вашего варианта использования и конец соединяет эти строки значений по умолчанию со строками реальных данных.

...