【发布时间】:2016-01-09 16:28:29
【问题描述】:
我有一张按钱包交易的表格。使用此表中的数据,我需要获取每个月每个钱包的余额信息。 月份列表必须从同一表中的交易日期定义。因此,如果第一笔交易是在 2012 年 1 月 14 日 23:44:12 并且最后一次是在本月(2015-10),我应该有这样的年月列表:
2012-01
2012-02
2012-03
...
2015-10
要获取可用年月组合的列表,我使用下一个子查询:
SELECT DISTINCT DATE_FORMAT( `created` , '%Y-%m' ) AS `d` FROM `transactions`
它应该足够好,因为我确信每个月至少有一笔交易(不是针对每个钱包,而是共同的)。
我需要实现的 - 列出每个可用月份的组合 + wallet_id + 该月的最大余额。如果在某个特定月份没有钱包交易,我需要从上个月取得余额。所以结果数据必须是这样的:
月 |钱包 |平衡 2012-01 | 234 | 111.10 2012-02 | 234 | 45.29 2012-03 | 234 | 45.29(2012-03没有交易,所以取上月的价值) 2012-04 | 234 | 45.29(2012-04没有交易,所以取上月的价值) 2012-05 | 234 | 45.29(2012-05没有交易,所以取上月的价值) 2012-06 | 234 | 45.29(2012-06 没有交易,所以取上月的价值) 2012-07 | 234 | 14.32(2012-07新交易,所以计算新值)我需要为每个钱包 ID 提供它。
带有事务的表具有下一个结构:
CREATE TABLE IF NOT EXISTS `transactions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`wallet_id` int(11) NOT NULL,
`credit` decimal(7,2) NOT NULL DEFAULT '0.00',
`bonus` decimal(7,2) NOT NULL DEFAULT '0.00',
`created` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `wallet_id` (`wallet_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
到目前为止,即使获取所有可用年月 + 钱包 ID + 余额的列表,我也遇到问题,如果本月没有此钱包的交易,余额为 NULL。所以现在我至少想要这样的列表(与上表相比,我最终需要得到):
月 |钱包 |平衡 2012-01 | 234 | 111.10 2012-02 | 234 | 45.29 2012-03 | 234 |空值 2012-04 | 234 |空值 2012-05 | 234 |空值 2012-06 | 234 |空值 2012-07 | 234 | 14.32如果我有这个,下一步是从前一行获取价值,如果当前有 NULL 余额。
到目前为止,我的查询如下所示:
SELECT dates.*, `t`.*
FROM (
SELECT DISTINCT DATE_FORMAT( `created` , '%Y-%m' ) AS `d`
FROM `transactions`
) AS `dates`
LEFT JOIN (
SELECT `wallet_id` ,
MAX( `credit` + `bonus` ) AS `balance` ,
DATE_FORMAT( `created` , '%Y-%m' ) AS `date`
FROM `transactions`
GROUP BY `wallet_id` , `date`
) AS `t` ON ( `t`.`date` = `dates`.`d` )
ORDER BY `t`.`wallet_id`, `t`.`date`
但是现在所有没有钱包交易的月份都被遗漏了。所以我有这样的事情:
月 |钱包 |平衡 2012-01 | 234 | 111.10 2012-02 | 234 | 45.29 2012-07 | 234 | 14.32如何修改查询以在我需要的视图中获取列表?
更好的是,如何实现我的最终目标,所有月份将在哪里,NULL 余额将被前一行的值替换?
重要的一点 - 我将使用查询结果作为一种视图(实际上是 BI 工具中的派生表)。
【问题讨论】:
-
@vhu,但我也无法获取余额值为 NULL 的列表,因此该答案只能解决我的部分问题。并且还必须说我将使用查询结果作为视图,该解决方案在这种情况下是否有效?
标签: mysql