我有一张桌子,我们称它为DummyTable。
它具有字段-price_effective
,store_invoice_updated_date
,bag_status
,gstin_code
。
现在我想从store_invoice_updated_date
和gstin_code
字段中获取按月,年分组的输出。
我想和那个小组一起做这些计算-
如果bag_status状态不是“ return_accepted”或“ rto_bag_accepted”,则price_effective的总和为“ forward_price_effective”。在这里不知道如何进行排除,即在注释中使用过滤器
如果bag_status为“ return_accepted”或“ rto_bag_accepted”,则价格总和为“ return_price_effective”。
从“ forward_price_effective”中减去“ return_price_effective”的“ total_price”字段。
我已经制定了此查询,该查询不起作用
from django.db.models.functions import TruncMonth
from django.db.models import Count, Sum, When, Case, IntegerField
DummyTable.objects.annotate(month=TruncMonth('store_invoice_updated_date'), year=TruncYear('store_invoice_updated_date')).annotate(forward_price_effective=Sum(Case(When(bag_status__in=['delivery_done']), then=Sum(forward_price_effective)), output_field=IntegerField()), return_price_effective=Sum(Case(When(bag_status__in=['return_accepted', 'rto_bag_accepted']), then=Sum('return_price_effective')), output_field=IntegerField())).values('month','year','forward_price_effective', 'return_price_effective', 'gstin_code')
答案 0 :(得分:0)
通过多个查询集解决。 只是找不到一种适当地将“案例”与“何时”与“过滤器”和“排除”一起使用的方法。
basic_query = BagDetails.objects.filter(store_invoice_updated_date__year__in=[2018]).annotate(month=TruncMonth('store_invoice_updated_date'), year=TruncYear('store_invoice_updated_date') ).values('year', 'month', 'gstin_code', 'price_effective', 'company_id', 'bag_status')
forward_bags = basic_query.exclude(bag_status__in=['return_accepted', 'rto_bag_accepted']).annotate(
Sum('price_effective')).values('year', 'month', 'gstin_code', 'price_effective', 'company_id')
return_bags = basic_query.filter(bag_status__in=['return_accepted', 'rto_bag_accepted']).annotate(
Sum('price_effective')).values('month', 'gstin_code', 'price_effective', 'company_id')