我用聚合来计算一列布尔数。我想要真实值的数目。
DJANGO代码:
count = Model.objects.filter(id=pk).aggregate(bool_col=Count('my_bool_col')
返回所有行的计数。
SQL查询应为:
SELECT count(CASE WHEN my_bool_col THEN 1 ELSE null END) FROM <table_name>
这是我的实际代码:
stats = Team.objects.filter(id=team.id).aggregate(
goals=Sum('statistics__goals'),
assists=Sum('statistics__assists'),
min_penalty=Sum('statistics__minutes_of_penalty'),
balance=Sum('statistics__balance'),
gwg=Count('statistics__gwg'),
gk_goals_avg=Sum('statistics__gk_goals_avg'),
gk_shutout=Count('statistics__gk_shutout'),
points=Sum('statistics__points'),
)
感谢使用django-aggregate-if的建议
以下是解决方案:
from django.db.models import Sum
from django.db.models import Q
from aggregate_if import Count
stats = Team.objects.filter(id=team.id).aggregate(
goals=Sum('statistics__goals'),
assists=Sum('statistics__assists'),
balance=Sum('statistics__balance'),
min_penalty=Sum('statistics__minutes_of_penalty'),
gwg=Count('statistics__gwg', only=Q(statistics__gwg=True)),
gk_goals_avg=Sum('statistics__gk_goals_avg'),
gk_shutout=Count('statistics__gk_shutout', only=Q(statistics__gk_shutout=True)),
points=Sum('statistics__points'),
)
为Django 1.10更新。现在可以执行条件聚合:
更多信息请访问:
布尔伯爵的另一个解决方案是:
只需将
False
转换为0和True
转换为1,然后只需Sum
更新:
从Django 1.10开始,您可以:
阅读Conditional Expression classes
老答案
似乎您要做的是某种“条件聚合”。现在
Aggregation
函数不支持像filter
或exclude
这样的查找:fieldname,fieldname。。。所以你可以试试这个:
django-aggregate-if
描述摘自官方页面。
你也可以首先为每个团队计算期望值,我的意思是为每个团队计算你感兴趣领域中的
True
数量。然后做所有你想做的事。相关问题 更多 >
编程相关推荐