如何解决Django聚合聚合-无法计算Sum是聚合
我正在尝试执行一个聚合的聚合,但是看起来是不可能的(SQL不允许)
让我们开始定义包含查询集的内容:
- DW00 2020-01-01 2020-03-31 653.38
- DW00 2020-01-01 2020-03-31 8,346.54
- DW00 2020-04-01 2020-06-30 488.00
- DW00 2020-04-01 2020-06-30 8,346.54
- DW00 2020-07-01 2020-09-30 488.00
- DW00 2020-07-01 2020-09-30 8,390.07
- R00 2020-01-01 2020-03-31 6,877.11
- R00 2020-04-01 2020-06-30 6,877.11
- R00 2020-07-01 2020-09-30 6,877.11
值分别为:condition_type
,calculation_from
,calculation_to
和net
。
现在,我们希望对具有相同condition_type
和相同能力期限(calculation_from
,calculation_to
)的行求和,这将转换为 1 和行2 合并在一起,行 3 和 4 ,最后是 5 和 6 。
sap_payments = sap_payments.values('condition_type','calculation_from','calculation_to') \
.annotate(competence=Sum('net')) \
.order_by()
这将返回另一个查询集,其中包含:
- {'competence':Decimal('8999.92'),'calculation_from':datetime.date(2020,1,1),'condition_type':'DW00','calculation_to': datetime.date(2020,3,31)}
- {'competence':Decimal('8834.54'),'calculation_from':datetime.date(2020,4,1),'condition_type':'DW00','calculation_to': datetime.date(2020,6,30)}
- {'competence':Decimal('8878.07'),'calculation_from':datetime.date(2020,7,1),'condition_type':'DW00','calculation_to': datetime.date(2020,9,30)}
- {'competence':Decimal('6877.11'),'calculation_from':datetime.date(2020,1,1),'condition_type':'R00','calculation_to': datetime.date(2020,3,31)}
- {'competence':Decimal('6877.11'),'calculation_from':datetime.date(2020,4,1),'condition_type':'R00','calculation_to': datetime.date(2020,6,30)}
- {'competence':Decimal('6877.11'),'calculation_from':datetime.date(2020,7,1),'condition_type':'R00','calculation_to': datetime.date(2020,9,30)}
现在我们要计算每种能力的calculation_from
与calculation_to
之间的天差
sap_payments = sap_payments.annotate(days_diff=ExpressionWrapper(
F('calculation_to') - F('calculation_from'),output_field=DurationField()))
只需在上一个查询集中添加days_diff即可:
- {'competence':Decimal('8999.92'),'days_diff':datetime.timedelta(90),'calculation_from':datetime.date(2020,1,1), 'condition_type':'DW00','calculation_to':datetime.date(2020,3, 31)}
- {'competence':Decimal('8834.54'),'days_diff':datetime.timedelta(90),'calculation_from':datetime.date(2020,4,1), 'condition_type':'DW00','calculation_to':datetime.date(2020,6, 30)}
- {'competence':Decimal('8878.07'),'days_diff':datetime.timedelta(91),'calculation_from':datetime.date(2020,7,1), 'condition_type':'DW00','calculation_to':datetime.date(2020,9, 30)}
- {'competence':Decimal('6877.11'),'days_diff':datetime.timedelta(90),'calculation_from':datetime.date(2020,1,1), 'condition_type':'R00','calculation_to':datetime.date(2020,3,31)}
- {'competence':Decimal('6877.11'),'days_diff':datetime.timedelta(90),'calculation_from':datetime.date(2020,4,1), 'condition_type':'R00','calculation_to':datetime.date(2020,6,30)}
- {'competence':Decimal('6877.11'),'days_diff':datetime.timedelta(91),'calculation_from':datetime.date(2020,7,1), 'condition_type':'R00','calculation_to':datetime.date(2020,9,30)}
现在是时候收集汇总数据了。我们要对不同的competence
的{{1}}和days_diff
求和。
condition_type
会引发以下错误:
sap_payments = sap_payments.values('condition_type') \
.annotate(net_sum=Sum('competence'),days_diff_sum=Sum('days_diff')) \
.order_by()
我如何实现自己想要的?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。