【问题标题】:How to return a row for every date in SQL?如何为 SQL 中的每个日期返回一行?
【发布时间】:2023-01-29 20:28:50
【问题描述】:

我想从我的 MySQL 数据库中检索过去 7 天每个日期的交易总和,但有些日期没有任何交易。那些日子我如何返回 0?

这是我曾经处理过并尝试过的 SQL 查询,但是这个查询只提供那些在那些日子里确实有价值的查询。

SELECT COUNT(transaction_id) AS orders, SUM(amount) AS sales, CAST(time AS DATE) AS time FROM tbltransactions WHERE time BETWEEN CAST(? AS DATE) AND CAST(? AS DATE) GROUP BY CAST(time AS DATE) ORDER BY time ASC

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    先尝试generate日期,然后加入你的数据表:

     SELECT COUNT(transaction_id) AS orders
          , SUM(amount) AS sales
          , CAST(dates.time AS DATE) AS time 
     FROM 
     (
        SELECT DATE_SUB(CURDATE(), INTERVAL 7 DAY) + INTERVAL num DAY AS time
        FROM 
        (
           SELECT 1 AS num UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
         ) n 
      ) dates
     LEFT JOIN tbltransactions 
        ON dates.time = tbltransactions.time
     GROUP BY CAST(dates.time AS DATE) 
     ORDER BY dates.time ASC
    

    这是测试数据:

    CREATE TABLE tbltransactions (
      time DATE,
      transaction_id INT,
      amount DECIMAL(10,2)
    );
    
    INSERT INTO tbltransactions (time, transaction_id, amount)
    VALUES 
      ('2023-01-20', 1, 100.00),
      ('2023-01-21', 2, 200.00),
      ('2023-01-27', 3, 300.00),
      ('2023-01-29', 4, 400.00),
      ('2023-01-29', 5, 500.00);
    

    【讨论】:

      【解决方案2】:

      您可以使用带有 SELECT 语句的子查询来生成最近 7 天内所有日期的列表,然后将其与事务表进行 LEFT JOIN。这将为您提供一个没有交易的日期为 0 的结果集:

      SELECT  dates.date, COALESCE(SUM(transactio s.amount), 0) AS total_amount FROM (SELECT DATE_SUB(CURDATE(),INTERVAL (7 + (@i := @i + 1)) DAY) AS date  FROM    (SELECT @i := -1) r, information_schema.tables  LIMIT 7) dates LEFT JOIN transactions ON dates.date =DATE(transactions.transaction_date) GROUP BY dates.date ORDER BY dates.date DESC;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 2019-05-11
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        相关资源
        最近更新 更多