【问题标题】:Django, how to write SQL or ORM to sum something?Django,如何编写 SQL 或 ORM 来总结一些东西?
【发布时间】:2023-04-03 15:50:01
【问题描述】:

我想这样算:

输入列表:

  • AAA女1
  • AAA女2
  • BBB男2
  • BBB男1
  • AAA男1

输出列表:

  • AAA男1
  • AAA女3
  • BBB男3

对不起,我的英语不好,谢谢所有帮助我的人。

【问题讨论】:

  • 需要求和的字段/模型有哪些?
  • 我的模型字段是“姓名”、“性别”、“计数”。我想将具有相同“名称”和“性别”的数据组合起来,然后将它们相加。

标签: sql django django-models


【解决方案1】:

不知道您的确切模型结构,但您需要运行的查询应该类似于以下内容:

假设您的型号名称为“YourModel”,包含“AAA”或“BBB”的字段为“field_1”,包含“女性”的“男性”的字段为“field_2”,包含数值的字段为“field_3”

from django.db.models import Sum
YourModel.objects.filter(field_1='AAA', field_2='male').aggregate(sum=Sum('field_3')).get('sum')  # AAA male 1
YourModel.objects.filter(field_1='AAA', field_2='female').aggregate(sum=Sum('field_3')).get('sum')  # AAA female 3
YourModel.objects.filter(field_1='BBB', field_2='male').aggregate(sum=Sum('field_3')).get('sum')  # BBB male 3

我从您对您想按姓名和性别分组的问题的评论中看到,然后将它们的计数相加。您可以使用以下注释来做到这一点:

from django.db.models import Sum
YourModel.objects.values('name', 'gender').annotate(sum=Sum('count'))

在这里,您可以使用 values('name', 'gender') 部分按姓名和性别分组,并用计数总和注释每个姓名 - 性别对行。

【讨论】:

  • 谢谢,但我有一个问题。一个聚合只能生成一行数据,有什么东西可以生成一个列表(所有数据)?
  • @Tony.Luo 我认为您正在寻找的是注释,有了这些,您可以将计算值添加到结果的每一行。你可以在这里阅读它们:docs.djangoproject.com/en/2.2/ref/models/querysets/#annotate
  • @Tony.Luo 我已经更新了答案以添加这样的查询
【解决方案2】:

在 SQL 中,您可以通过简单的聚合来做到这一点。假设像mytable(name, cnt) 这样的表结构,你会这样做:

select name, sum(cnt) sum_cnt
from mytable
group by name

【讨论】:

    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多