我有一个表,其中包含:
id date user_id duration amount
1 2014-01-01 00:00:00 1 1 £10
2 2014-01-02 00:00:00 2 2 £10
3 2014-01-03 00:00:00 3 3 £10
我试图显示每月的金额。有什么想法如何在查询中做到这一点?
3条答案
按热度按时间dxxyhpgq1#
假设您可以轻松地从日期时间中提取月份,因此真实的的问题是关于聚合逻辑,并且您可以创建一个数字表。
下面是一个简单的例子来展示这种模式。
小提琴
nle07wnf2#
和Karl一样,我非常确信某种数字表在这里是必要的。我个人喜欢the approach given here,它定义了一个视图(好吧,有几个)来生成数字,而不是必须实际存储一个充满数字的表。无论你使用表还是视图,当你从它
SELECT
时,它看起来就像这样:使用它,您可以构建如下查询:
这会给我们一个如下的结果(SQL Fiddle):
我插入了空行来分隔
purchase_id
组,这样您就可以看到n
是如何随组中的每个项目从0
增加到duration - 1
的。正如您所看到的,year_mon
等于date_purchased
月的第一天之后的n
个月加上n
个月,amount
等于amount_income / duration
。我们差不多完成了,但是可以看到
year_mon
有重复:2014-01-01
显示了两次,这是一个好消息,因为我们可以使用GROUP BY
按该列分组,使用SUM(amount)
得到该月的总数:此查询与上个月的唯一区别是,我们先执行
GROUP BY year_mon
,然后执行SUM(amount_income / duration)
,以获得该月的total
,生成以下结果(SQL Fiddle):...当然,您可以使用
DATE_FORMAT
和CAST
或ROUND
来获得格式良好的日期和金额,或者您也可以在前端代码中这样做。ujv3wf0j3#
关于:
GROUP BY a.采购标识
在一个镜头中完成这一点有点棘手--可能会有所改进--但这会产生以下结果:
我的数据集是: