SQL 怎么按时间汇总累计金额

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 怎么按时间汇总累计金额相关的知识,希望对你有一定的参考价值。

怎么写SQL,想用一段代码同时查到每个月的金额和每一年的累计金额,这边的每一年是从4月1日到第二年的3月31日。

参考技术A select 日期,sum(金额) 金额 from 表名 group by 日期

如何按日期汇总 Django 模型字段并根据当前月份和年份显示总计

【中文标题】如何按日期汇总 Django 模型字段并根据当前月份和年份显示总计【英文标题】:How Can I Sum Django Models Field by Dates and Display Totals base on Current Month and Year 【发布时间】:2021-10-22 08:56:33 【问题描述】:

我是 python Django 框架的新手,我希望有人能帮助我处理一些我一直在苦苦挣扎的代码。 我有一个包含日期和金额字段的支出模型,我想计算当月的总金额并使用上下文字典通过视图显示在 django 模板中。 这是我的支出模型代码:

class Expenditure(models.Model):
      amount = models.PositiveIntegerField(null=False)
      date = models.DateField(auto_now_add=False, auto_now=False, null=False)

Views.py 代码在这里:

from django.db.models import Count, Sum
from django.db import connection

def index(request):
    truncate_month = connection.ops.date_trunc_sql('month','day')
    total_income = Income.objects.extra('month': truncate_month).values('date').annotate(Sum('amount'))
    context = 
         'total_income':total_income,
    
    return render(request, 'dashboard/index.html', context)

这就是我试图在 Django 模板中显示当前月份和年份的总金额的方式。

% for income in total_income %
   income.dateincome.amount
% endfor %

我上面的代码的结果是在模板上显示来自支出模型的日期月份而这是我期望的唯一输出结果:'Aug. 2021 年:仅 13,000' 因为 8 月是 2021 年唯一的当前月份。您的帮助将大有帮助。谢谢

【问题讨论】:

【参考方案1】:

看来您只是没有在 values 调用中使用截断的字段。

与此一致,你可以使用django的TruncMonth进行注释和按月分组:

from django.db.models.functions import TruncMonth


total_income = Income.objects.annotate(month=TruncMonth('date')).values('month').annotate(total_amount=Sum('amount'))

context = 
     'total_income': total_income,

然后在您的模板中,使用这些带注释的字段,如下所示:

% for income in total_income %
   income.month   income.total_amount 
% endfor %

编辑

如果您只在当前月份和年份需要它,只需对其进行过滤并运行如下聚合:

import datetime


now = datetime.datetime.now()
total_income = Income.objects.filter(
    date__year=now.year, date__month=now.month
).aggregate(total_income=Sum('total_income'))['total_income']

context = 
    'year': now.year,
    'month': now.strftime('%B'),
    'total_income': total_income,

在模板中,不需要迭代任何东西:

   year  -  month  :  total_income 

【讨论】:

感谢@bdbd 的回答。它给了我 90% 的解决方案,因为输出显示了数据库中所有月份的总和,而我只希望得到当前月份,即 2021 年 8 月。您的进一步输入将不胜感激。谢谢 非常抱歉,bdbd,您编辑的答案最初解决了问题,但我是错误地将您的代码粘贴到我的代码中的人。实际上,这就是您的答案的输出:2021 - 8 : 13000。如果能用八月这样的文字写出月份,我将不胜感激。非常感谢。 更新了答案

以上是关于SQL 怎么按时间汇总累计金额的主要内容,如果未能解决你的问题,请参考以下文章

新年累计金额从零开始

每月汇总金额的 SQL 数据透视表

熊猫:将汇率查询乘以另一个数据框的相同日期后,按每日金额求和和汇总

SQL Server 在日期范围内聚合

怎么按占比平摊实收金额?

在同一行转置(枢轴)中按百分比拆分的复杂 SQL 金额?