Django ORM,通过查询求和列值
Django ORM, Sum column values through query
我有一个 table 具有以下值:
user
amount
date
John
10
2017-07-01
John
20
2019-07-01
John
30
2020-09-01
John
40
2021-11-01
...
...
...
Dan
-20
2019-02-01
Dan
-30
2020-04-01
Dan
-40
2021-06-01
函数的输入是一个日期范围,例如:
date_start = '2019-01-01'
date_end = '2021-11-07'
预期输出:
对于所有用户,对于这个日期范围内的每个日期,我想 return sum
的 amounts
,从当前日期到所有以前的日期,像这样:
user
amount
date
John
30 (10+20)
2019-07-01
John
60 (10+20+30)
2020-09-01
John
100 (10+20+30+40)
2021-11-01
...
...
...
Dan
-20
2019-02-01
Dan
-50 (-20-30)
2020-04-01
Dan
-90 (-20-30-40)
2021-06-01
我的努力
def get_sum_amount(self, date_start=None, date_end=None):
date_detail = {}
# Minimum date
if date_start:
date_detail['date__gt'] = date_start
# Maximum date
if date_end:
date_detail['date__lt'] = date_end
detail = Financial.objects.filter(Q(**date_detail)) \
.values('user') \
.annotate(sum_amount=Coalesce(Sum(F('amount')), Value(0)))
但没有结果。
已更新
上述示例的函数输出为:
user
amount
John
100
Dan
-90
您可以使用 Window
函数,分区为 user
到 运行 每个用户的累计总和,按日期排序:
detail = Financial.objects.filter(**date_detail).annotate(
running_amount=Window(
expression=Sum('amount'),
partition_by=[F('user')],
order_by=F('date').asc(),
)
)
我有一个 table 具有以下值:
user | amount | date |
---|---|---|
John | 10 | 2017-07-01 |
John | 20 | 2019-07-01 |
John | 30 | 2020-09-01 |
John | 40 | 2021-11-01 |
... | ... | ... |
Dan | -20 | 2019-02-01 |
Dan | -30 | 2020-04-01 |
Dan | -40 | 2021-06-01 |
函数的输入是一个日期范围,例如:
date_start = '2019-01-01'
date_end = '2021-11-07'
预期输出:
对于所有用户,对于这个日期范围内的每个日期,我想 return sum
的 amounts
,从当前日期到所有以前的日期,像这样:
user | amount | date |
---|---|---|
John | 30 (10+20) |
2019-07-01 |
John | 60 (10+20+30) |
2020-09-01 |
John | 100 (10+20+30+40) |
2021-11-01 |
... | ... | ... |
Dan | -20 | 2019-02-01 |
Dan | -50 (-20-30) |
2020-04-01 |
Dan | -90 (-20-30-40) |
2021-06-01 |
我的努力
def get_sum_amount(self, date_start=None, date_end=None):
date_detail = {}
# Minimum date
if date_start:
date_detail['date__gt'] = date_start
# Maximum date
if date_end:
date_detail['date__lt'] = date_end
detail = Financial.objects.filter(Q(**date_detail)) \
.values('user') \
.annotate(sum_amount=Coalesce(Sum(F('amount')), Value(0)))
但没有结果。
已更新
上述示例的函数输出为:
user | amount |
---|---|
John | 100 |
Dan | -90 |
您可以使用 Window
函数,分区为 user
到 运行 每个用户的累计总和,按日期排序:
detail = Financial.objects.filter(**date_detail).annotate(
running_amount=Window(
expression=Sum('amount'),
partition_by=[F('user')],
order_by=F('date').asc(),
)
)