前言:本文以學習記錄的形式發表出來,前段時間苦於照模型聚合中group by 找了很久,官方文章中沒有很明確的說出group by,但在文檔中有提到!!!正文(最後編輯於2016-11-12):聚合:LOrder.objects.values('com_chnl_name').annotate(Co...
前言:本文以學習記錄的形式發表出來,前段時間苦於照模型聚合中group by 找了很久,官方文章中沒有很明確的說出group by,但在文檔中有提到!!!
正文(最後編輯於2016-11-12):
聚合:
LOrder.objects.values('com_chnl_name').annotate(Count('serv_id'))
#相當於select count(serv_id) from LOrder group by com_chnl_name
模型高級運用—條件表達式+資料庫函數:
條件表達式:
from django.db.models import IntegerField,Sum,When,Q,Case #模型執行查詢集
LOrder.objects.values('com_chnl_name').annotate(
cdma=Sum(
Case(When(Q(prod_offer_name__contains='語音CDMA') & Q(service_offer_name='訂購'),then=1),
output_field=IntegerField())
),
)
#相當於select sum(case when prod_offer_name like’%.語音CDMA %’ and service_offer_name='訂購' then 1 end) , com_chnl_name from LOrder group by com_chnl_name,該SQL語句也算是SQL中的中級部分. 其中&相當於and 對應的|相當於or
問題:聚合函數得到的結果如果不存在,那麼會返回None,這對於結果全是數字的話,進行數字加減乘除很不方便,所以運用資料庫函數將None改為0,以下例子:
資料庫函數和條件表達式一起運用:
from django.db.models import IntegerField,Sum,When,Q,Case,Value as V #模型執行查詢集
from django.db.models.functions import Coalesce #模型部分:資料庫函數
LOrder.objects.values('com_chnl_name').annotate(
cdma_dg=Coalesce(Sum(
Case(When(Q(prod_offer_name__contains='語音CDMA') & Q(service_offer_name='訂購'),then=1),
output_field=IntegerField())
),V(0)),
Coalesce¶
接受一個含有至少兩個欄位名稱或表達式的列表,返回第一個非空的值(註意空字元串不被認為是一個空值)。每個參與都必須是相似的類型,所以摻雜了文本和數字的列表會導致資料庫錯誤。
使用範例:
>>> # Get a screen name from least to most public
>>> from django.db.models import Sum, Value as V
>>> from django.db.models.functions import Coalesce
>>> Author.objects.create(name='Margaret Smith', goes_by='Maggie')
>>> author = Author.objects.annotate(
... screen_name=Coalesce('alias', 'goes_by', 'name')).get()
>>> print(author.screen_name)
Maggie
>>> # Prevent an aggregate Sum() from returning None
>>> aggregated = Author.objects.aggregate(
... combined_age=Coalesce(Sum('age'), V(0)),
... combined_age_default=Sum('age'))
>>> print(aggregated['combined_age'])
0
>>> print(aggregated['combined_age_default'])
None