【问题标题】:Take previous row value if current row value is NULL如果当前行值为 NULL,则取上一行值
【发布时间】: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 工具中的派生表)。

【问题讨论】:

标签: mysql


【解决方案1】:

生成序列

据我所知,您需要 mysql 中的行生成器,但只有一个。见How do I make a row generator in MySQL?

在以下位置尝试“generate_series”程序: generate many rows with mysql

在现有数据库中搜索月份序列

作为替代解决方案,我会在 DB 中找到一种方法来存储每个月的值(因此您不必生成月份序列)。如果你没有很多插入,你可以做一个触发器来检查是否有前几个月的数据,如果为空则创建空交易

【讨论】:

    猜你喜欢
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多