我有一个 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/