mysql - 如何生成一个 View ,其中包含来自辅助 View 的总和?

标签 mysql sql

我有一个 View ,用于生成每周运行的关键任务 cron 的验证报告。 View 显示每周运行, 贷记账户总额之和, (我的结果归功于 SO 伙伴!),开放账户总和,已关闭账户总和,基本内容。

mysql> select * from view_command_OPEN_CLOSED_tally limit 5;
+---------------------+-------------------------+-----------------------+---------------------+-------------------+----------------------+--------------------+
| created             | total_accounts_credited | total_amount_credited | total_open_credited | total_amount_open | total_closed_credited| total_amount_closed|
+---------------------+-------------------------+-----------------------+---------------------+-------------------+----------------------+--------------------+
| 2019-01-19 00:00:00 |                   18175 |               3173.68 |               16953 |           7063.68 |                 1222 |             110.00 |
| 2019-01-12 00:00:00 |                   18135 |               4768.43 |               17053 |           9358.43 |                 1082 |             410.00 |
| 2019-01-10 09:00:27 |                      80 |               1497.75 |                  80 |           1497.75 |                    0 |               0.00 |
| 2019-01-09 09:20:55 |                      51 |                933.50 |                  50 |            915.75 |                    1 |              17.75 |
| 2019-01-08 16:45:14 |                      10 |                187.50 |                  10 |            187.50 |                    0 |               0.00 |
+---------------------+-------------------------+-----------------------+---------------------+-------------------+----------------------+--------------------+

我假设我可以很容易地从这个 View 生成第二个 View ,其中一个子查询将显示与前一周的百分比差异。 IE: 创建、total_accounts_credited、difference_from_last_week_in_percent、total_ammount_credited、difference_in_percent_from_last_week 等... 我无法获得前一周的结果来匹配数据并计算百分比。结果集显示前几行 我试过的查询都围绕着一个基本的左连接,但由于某种原因,“上周”的结果没有显示在适当的位置。 我显然在我的方法中做了一些对 MySQL 不尊重的事情,作为回应,它让我吐出一个不连贯的结果集。

mysql> SELECT vtally.created,
    ->        vtally.total_accounts_credited,
    ->        vtally2.total_accounts_credited `previous`,
    ->        vtally.total_open_credited ,
    ->        vtally2.total_open_credited `previous`,
    ->        vtally.total_closed_credited,
    ->        vtally2.total_closed_credited`previous`
    -> FROM view_command_OPEN_CLOSED_tally vtally
    -> LEFT JOIN view_command_OPEN_CLOSED_tally vtally2
    ->   ON vtally.created = vtally2.created - INTERVAL 7 DAY
    -> GROUP BY
    ->   DATE(vtally.created)
    -> ORDER BY vtally.created DESC LIMIT 2;
+---------------------+-------------------------+----------+---------------------+----------+----------------------+----------+
| created             | total_accounts_credited | previous | total_open_credited | previous | total_closed_credited | previous |
+---------------------+-------------------------+----------+---------------------+----------+----------------------+----------+
| 2019-01-19 00:00:00 |                    8175 |     NULL |                6953 |     NULL |                  222 |     NULL |
| 2019-01-12 00:00:00 |                    8135 |     8175 |                7053 |     6953 |                  082 |     1222 |
+---------------------+-------------------------+----------+---------------------+----------+----------------------+----------+

上面的结果集是一个例子, 我希望结果如下,每个前一列都在其左侧保留前一周的列结果:

(仅顶行,忽略底行)

+---------------------+-------------------------+----------+---------------------+----------+----------------------+----------+
| created             | total_accounts_credited | previous | total_open_credited | previous | total_closed_credited | previous |
+---------------------+-------------------------+----------+---------------------+----------+----------------------+----------+
| 2019-01-19 00:00:00 |                    8175 |     8135 |                6953 |     7053 |                  222 |     082 |
| 2019-01-12 00:00:00 |                    8135 |     8175 |                7053 |     6953 |                  082 |     1222 |
+---------------------+-------------------------+----------+---------------------+----------+----------------------+----------+

要在正确的列中显示正确的“先前”总数,我缺少什么?

我相信它可能是 Group BY,但不知道从这里去哪里它似乎尝试了所有选项。

最佳答案

如果 vtally2 表示以前的数据,则表示 vtally.created > vtally2.created

因此,将减号更改为加号:vtally.created = vtally2.created + INTERVAL 7 DAY 在您的连接中。

如果您在子查询中使用窗口函数计算列,您也可以忽略您的间隔非常数

像这样:

WITH numbered_tally AS (
    select created, total_accounts_credited, total_open_credited, total_closed_credited,
           row_number() OVER (ORDER BY created) AS tally_number
    from view_command_OPEN_CLOSED_tally
)
SELECT  vtally.created,
        vtally.total_accounts_credited,
       vtally2.total_accounts_credited `previous`,
        vtally.total_open_credited ,
       vtally2.total_open_credited `previous`,
        vtally.total_closed_credited,
       vtally2.total_closed_credited `previous`
FROM numbered_tally  vtally
LEFT JOIN numbered_tally  vtally2
   ON vtally.tally_number = 1 + vtally2.tally_number

关于mysql - 如何生成一个 View ,其中包含来自辅助 View 的总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54274025/

相关文章:

php - Codeigniter模型: summary,在多个表中加入、分组

mysql - 错误号 : 1064 when select from database

mysql - 同一字段、不同行的不同结果如何

php - 确保日期/时间在全局范围内正确 PHP 5.3/MySQL

sql - 使用 sqldf 的 NA 值

MySqlConversionException问题

sql - Group by子句有什么用

MySQL 显示所有月份

mysql - 我可以在 GROUP BY 和 ORDER BY 上强制使用 2 个单独的索引吗?

SQL查询获取当前日期后X天的日期