django中的聚合函数中count需要加aggregate吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django中的聚合函数中count需要加aggregate吗相关的知识,希望对你有一定的参考价值。

aggregate是monogodb的聚合函数。完成类似于sql中的sum,count,group by等相关操作

1:count(*)

/**

* select count(*) count from zipsController

*/

var pipeline = [

$group:

_id: null,

count: $sum: 1

];

2:sum(*)

/**

* select sum(pop) total from zipsController

*/

var pipeline = [

$group:

_id: null,

total: $sum: "$pop"

];

3:group by

/**

* select sum(pop) total from zipsController group by state

*/

var pipeline =[

$group:

_id: "$state",

totalpop: $sum: "$pop"

];

假设现在关联关系 一个是UserEntity(用户),一个是DepartmentEntity(部门) 它们直接是多对多关系! 因为采取的是hibernate的注解 @JoinTable 。 所以中间实体(Entity)就没有去建立。

扩展资料:

当计算区域中存在错误时,MIN、MAX 和 PERCENTILE 函数不进行计算。出于相同的原因,LARGE、SMALL 和 STDEVP 函数也会影响某些条件格式规则的相应功能。

通过使用 AGGREGATE 函数,这些错误将被忽略,因而可以实现这些函数。此外,AGGREGATE 函数可将不同的聚合函数应用于列表或数据库,并提供忽略隐藏行和错误值的选项。

参考资料来源:百度百科-aggregate

参考技术A aggregate是monogodb的聚合函数。完成类似于sql中的sum,count,group by等相关操作
1:count(*)

/**
* select count(*) count from zipsController
*/
var pipeline = [


$group:
_id: null,
count: $sum: 1


];
2:sum(*)
/**
* select sum(pop) total from zipsController
*/
var pipeline = [

$group:
_id: null,
total: $sum: "$pop"


];
3:group by

/**
* select sum(pop) total from zipsController group by state
*/
var pipeline =[

$group:
_id: "$state",
totalpop: $sum: "$pop"


];本回答被提问者采纳

Django(18)聚合函数

前言

orm模型中的聚合函数跟MySQL中的聚合函数作用是一致的,也有像SumAvg、Count、MaxMin,接下来我们逐个介绍
 

聚合函数

所有的聚合函数都是放在django.db.models下面。并且聚合函数不能够单独的执行,聚合函数是通过aggregate方法来实现的。在说明聚合函数的用法的时候,都是基于以下的模型对象来实现的。

class Author(models.Model):
     """作者模型"""
     name = models.CharField(max_length=100)
     age = models.IntegerField()
     email = models.EmailField()

     class Meta:
         db_table = \'author\'


 class Publisher(models.Model):
     """出版社模型"""
     name = models.CharField(max_length=300)

     class Meta:
         db_table = \'publisher\'


 class Book(models.Model):
     """图书模型"""
     name = models.CharField(max_length=300)
     pages = models.IntegerField()
     price = models.FloatField()
     rating = models.FloatField()
     author = models.ForeignKey(Author,on_delete=models.CASCADE)
     publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)

     class Meta:
         db_table = \'book\'


 class BookOrder(models.Model):
     """图书订单模型"""
     book = models.ForeignKey("Book",on_delete=models.CASCADE)
     price = models.FloatField()

     class Meta:
         db_table = \'book_order\'

 

Avg

Avg:求平均值。比如想要获取所有图书的价格平均值。那么可以使用以下代码实现。

 from django.db.models import Avg
 result = Book.objects.aggregate(Avg(\'price\'))
 print(result)

 
以上的打印结果是:

 {"price__avg":23.0}

其中price__avg的结构是根据field__avg规则构成的。如果想要修改默认的名字,那么可以将Avg赋值给一个关键字参数。示例代码如下:

 from django.db.models import Avg
 result = Book.objects.aggregate(my_avg=Avg(\'price\'))
 print(result)

以上的打印结果为

 {"my_avg":23}

 

Count

Count:获取指定的对象的个数。示例代码如下:

 from django.db.models import Count
 result = Book.objects.aggregate(book_num=Count(\'id\'))

以上的result将返回Book表中总共有多少本图书。
Count类中,还有另外一个参数叫做distinct,默认是等于False,如果是等于True,那么将去掉那些重复的值。比如要获取作者表中所有的不重复的邮箱总共有多少个,那么可以通过以下代码来实现:

from djang.db.models import Count
result = Author.objects.aggregate(count=Count(\'email\',distinct=True))

 

Max和Min

Max和Min:获取指定对象的最大值和最小值。比如想要获取Author表中,最大的年龄和最小的年龄分别是多少。那么可以通过以下代码来实现:

from django.db.models import Max,Min
result = Author.objects.aggregate(Max(\'age\'),Min(\'age\'))

如果最大的年龄是90,最小的年龄是10。那么以上的result将为:

{"age__max":90,"age__min":10}

 

Sum

Sum:求指定对象的总和。比如要求图书的销售总额。那么可以使用以下代码实现:

from djang.db.models import Sum
result = Book.objects.annotate(total=Sum("bookorder__price"))

以上的代码annotate的意思是给Book表在查询的时候添加一个字段叫做total,这个字段的数据来源是从BookOrder模型的price的总和而来。
 

aggregate和annotate的区别

  • 相同点:这两个方法都可以执行聚合函数。
  • 不同点:
    • aggregate返回的是一个字典,在这个字典中存储的是这个聚合函数执行的结果。而annotate返回的是一个QuerySet对象,并且会在查找的模型上添加一个聚合函数的属性。
    • aggregate不会做分组,而annotate会使用group by子句进行分组,只有调用了group by子句,才能对每一条数据求聚合函数的值。

 

F表达式:

F表达式: 动态的获取某个字段上的值。并且这个F表达式,不会真正的去数据库中查询数据,他相当于只是起一个标识的作用。比如想要将原来每本图书的价格都在原来的基础之上增加10元,那么可以使用以下代码来实现:

from django.db.models import F
Book.objects.update(price=F("price")+10)

 

Q表达式

Q表达式:使用Q表达式包裹查询条件,可以在条件之间进行多种操作。与/或非等,从而实现一些复杂的查询操作。例子如下:

  • 查找价格大于100,并且评分达到4.85以上的图书:
  # 不使用Q表达式的
  books = Book.objects.filter(price__gte=100,rating__gte=4.85)
  # 使用Q表达式的
  books = Book.objects.filter(Q(price__gte=100)&Q(rating__gte=4.85))
  • 查找价格低于100元,或者评分低于4分的图书:
books = Book.objects.filter(Q(price__gte=100)&Q(rating__gte=4.85))
  • 获取价格大于100,并且图书名字中不包含”传“字的图书:
books = Book.objects.filter(Q(price__gte=100)&~Q(name__icontains=\'传\'))

以上是关于django中的聚合函数中count需要加aggregate吗的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 ComosDb 中的聚合函数结果对查询结果进行排序?

django-分组聚合查询

Django(18)聚合函数

聚合函数count里面加条件

Django 使用表达式聚合查询

Django学习路17_聚合函数(Avg平均值,Count数量,Max最大,Min最小,Sum求和)基本使用