在Django中实现分组求和、按总和排序并拆分类型统计
Django分组统计实现方案
需求说明
按name字段分组,计算每组的qty总和(命名为sum_qty),同时统计每组内类型A、B、C各自的qty总和,最终按sum_qty排序。
实现代码
from django.db.models import Sum, Case, When, IntegerField # 执行查询并统计 query_result = TheModel.objects.values('name') \ .annotate( sum_qty=Sum('qty'), type_a=Sum(Case( When(type='A', then='qty'), default=0, output_field=IntegerField() )), type_b=Sum(Case( When(type='B', then='qty'), default=0, output_field=IntegerField() )), type_c=Sum(Case( When(type='C', then='qty'), default=0, output_field=IntegerField() )) ) \ .order_by('-sum_qty') # 降序排序,升序则改为 order_by('sum_qty')
代码解释
values('name'):指定按name字段进行分组annotate():添加聚合统计字段:sum_qty=Sum('qty'):直接计算每组的qty总合- 各类型的统计使用
Case/When条件判断,匹配对应type时取对应qty值,否则取0,再通过Sum聚合得到该类型的总合
order_by('-sum_qty'):按sum_qty降序排列结果,若需要升序去掉负号即可
测试结果验证
针对给出的5条测试数据,执行上述代码后得到的结果如下(降序):
| name | sum_qty | type_a | type_b | type_c |
|---|---|---|---|---|
| name2 | 15 | 5 | 0 | 10 |
| name1 | 10 | 3 | 3 | 4 |
内容的提问来源于stack exchange,提问作者Mas Zero
相关产品推荐
相关产品推荐

