【问题标题】:YTD Calculations in MySQL from (SELECT statement) including All Days of YearMySQL 中的 YTD 计算来自(SELECT 语句),包括一年中的所有日期
【发布时间】:2020-02-12 18:47:27
【问题描述】:

鉴于此查询...

select
    sum(count) as quotes,
    date
from (
      select 
         1 as count, 
         DATE_FORMAT(CONVERT_TZ(createdAt, 'UTC', 'US/Pacific'), "%Y-%m-%d") as date 
      from quotes 
      where deletedAt IS NULL
    ) q1 
group by date 
order by date;

我得到以下结果(仅显示 2020-02 年的结果,但实际结果会追溯到几年前)...

注意:2020-02-02 收到 0 个报价,并且丢失了

+-------+------------+
| count |    date    |
+-------+------------+
|     1 | 2020-02-01 |
|     2 | 2020-02-03 |
|     1 | 2020-02-04 |
|     1 | 2020-02-05 |
|     1 | 2020-02-06 |
|     1 | 2020-02-07 |
|     3 | 2020-02-08 |
|     3 | 2020-02-09 |
|     3 | 2020-02-10 |
|     1 | 2020-02-11 |
+-------+------------+

如何将查询修改为...

  • 填写缺失的日期(例如本例中的 2020-02-02)
  • 添加 ytdCount 列,这是按年滚动计数

让输出是这样的……

             add the ytdCount column
             \/
+-------+----------+------------+
| count | ytdCount |    date    |
+-------+----------+------------+
|     1 |        1 | 2020-02-01 |
|     0 |        1 | 2020-02-02 | <- was missing from previous example
|     2 |        3 | 2020-02-03 |
|     1 |        4 | 2020-02-04 |
|     1 |        5 | 2020-02-05 |
|     1 |        6 | 2020-02-06 |
|     1 |        7 | 2020-02-07 |
|     3 |       10 | 2020-02-08 |
|     3 |       13 | 2020-02-09 |
|     3 |       16 | 2020-02-10 |
|     1 |       17 | 2020-02-11 |
+-------+----------+------------+

参考

  • 我找到了MYSQL to calculate YTD,它显示了如果我从一个简单的表中选择如何执行此操作,但由于我的“表”实际上是一个选择语句,我不确定如何将示例转换为我的用例。
  • 我找到了get all dates in the current month,它显示了如何生成一个月中的所有日期,但我需要特定年份的所有日期。

【问题讨论】:

  • 不是答案,但请查看日期脚手架以填充缺失的日期。 YTD 的一种可能性:窗口计算。
  • 谢谢@ChrisG 我做了一个快速搜索,但没有找到任何对搜索词“日期脚手架 mysql”有用的东西。如果您知道任何好的参考资料,我将不胜感激一两个链接
  • 我的糟糕,显然日期脚手架是 Tableau 特有的东西。试试这个链接:stackoverflow.com/questions/3538858/…

标签: mysql


【解决方案1】:

我通过创建两个临时表和一个 UNION 解决了​​这个问题

为报价创建临时表

 DROP TABLE IF EXISTS __quotes__;
 CREATE TABLE __quotes__ (quotes INT(11), ytdQuotes INT(11), date DATE)
      ENGINE=MEMORY
      AS
      select
        sum(count) as quotes,
        NULL as ytdQuotes,
        date
      from (select 1 as count, DATE_FORMAT(CONVERT_TZ(createdAt, 'UTC', 'US/Pacific'), "%Y-%m-%d") as date from quotes where deletedAt IS NULL) q1 group by date order by date;


为日期范围创建临时表

注意:您可以通过更改磨损条款轻松获得更多/更少天数

      DROP TABLE IF EXISTS __daterange__;
      CREATE TABLE __daterange__ (quotes INT(11), ytdQuotes INT(11), date DATE)
      ENGINE=MEMORY
      AS
      select
        NULL as quotes,
        NULL as ytdQuotes
        date
      from (select date
        from (
          SELECT a.date
              FROM (
                  SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + + (1000 * d.a)) DAY AS date
                  FROM       (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
                  CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
                  CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
                  CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS d) a
        ) daterange
        where date >= "2012-11-14") daterange;

最后,这是将所有内容组合在一起的查询

select
  coalesce(sum(quotes), 0) as quotes,
  coalesce((select sum(q2.quotes) from __quotes__ q2 where YEAR(report.date) = YEAR(q2.date) AND q2.date <= report.date), 0) as ytdQuotes,
  date
from (
  select * from __quotes__
  UNION ALL
  select * from __daterange__
) report
group by date

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多