【问题标题】:Add a row in query result if any date is missing between range SQL如果范围 SQL 之间缺少任何日期,则在查询结果中添加一行
【发布时间】:2020-02-27 10:41:09
【问题描述】:

我是 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

谁能帮帮我?

【问题讨论】:

    标签: sql sql-server date date-range


    【解决方案1】:

    Mysql 本身不能为不存在的数据返回行,您必须自己解决它,使其创建那些空行。

    我有一个类似的question,你可以参考this answer来实现你想要的。

    TLDR

    您基本上使用具有足够行数的表来提供所需的空行数量(我上面链接的答案使用information_schema.columns)结合变量生成具有递增值的行(m,...,n),然后您可以使用这些行和这些值来生成您需要的缺失数据,例如您的用例的日期,最后将这些默认值行与您的真实数据行连接起来。

    【讨论】:

      【解决方案2】:

      您需要生成日期列表。您可以通过多种方式做到这一点:

      • 明确。
      • 使用数字/计数/日历表。
      • 使用递归 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
      

      【讨论】:

      • 你能帮我写完整的查询吗?对我来说很难
      • @sunny 。 . .这个答案有完整的查询。
      • 实际上它显示错误Msg 195, Level 15, State 10, Line 13 'DATE' is not a recognized built-in function name. Msg 195, Level 15, State 10, Line 14 'DATE' is not a recognized built-in function name. Msg 195, Level 15, State 10, Line 15 'DATE' is not a recognized built-in function name.
      • @sunny 。 . .使用适合您的数据库的任何逻辑。您尚未指定您使用的数据库。
      • 我正在使用 MS SQL
      猜你喜欢
      • 1970-01-01
      • 2017-06-21
      • 2017-04-29
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多