在salesforce中,咱們作SOQL查詢時,每每須要用到計算式,好比求和,求平均值,或者過濾數據時,每每須要經過時間日期過濾,SOQL已經封裝了不少的函數,能夠更加方便咱們的sql查詢而不須要本身另外設計。sql
一. 聚合函數函數
經常使用的聚合函數有以下幾種:fetch
AVG():求平均值spa
COUNT():求記錄個數debug
COUNT_DISTINCT():求不重複記錄個數設計
MIN():求記錄中最小值code
MAX():求記錄中的最大值blog
SUM():求和get
這些聚合函數一般和group by fieldName 一塊兒用,達到分組目的。it
下面以Goods__c表進行簡單介紹,在Goods表裏面新增了四條數據,揭下來經過GoodsBrand對Goods進行分組,求GoodsPrice的總和,平均值,最大值,最小值以及此種GoodsBrand所擁有的條數。
代碼以下所示:
1 String fetchGoodsAggregate = 'select GoodsBrand__c,SUM(GoodsPrice__c) goodsPriceTotal,AVG(GoodsPrice__c) goodsPriceAvg,COUNT(Id) recordCount,MIN(GoodsPrice__c) goodsPriceMin,MAX(GoodsPrice__c) goodsPriceMax from Goods__c group by GoodsBrand__c'; 2 List<AggregateResult> aggregateResults = Database.query(fetchGoodsAggregate); 3 for(AggregateResult result : aggregateResults) { 4 system.debug(JSON.serializePretty(result)); 5 }
結果以下所示:
1 { 2 "attributes" : { 3 "type" : "AggregateResult" 4 }, 5 "GoodsBrand__c" : "華爲", 6 "goodsPriceTotal" : 5000.0, 7 "goodsPriceAvg" : 2500.0, 8 "recordCount" : 2, 9 "goodsPriceMin" : 2000.000000, 10 "goodsPriceMax" : 3000.000000 11 } 12 13 { 14 "attributes" : { 15 "type" : "AggregateResult" 16 }, 17 "GoodsBrand__c" : "小米", 18 "goodsPriceTotal" : 3000.0, 19 "goodsPriceAvg" : 1500.0, 20 "recordCount" : 2, 21 "goodsPriceMin" : 1000.000000, 22 "goodsPriceMax" : 2000.000000 23 }
上述代碼中,咱們看到了一個sObject,他的名稱爲AggregateResult,此sObject的做用爲獲取計算式查詢的結果信息,此sObject爲read only類型。在上述查詢中,若是須要查到具體的內容,只需在result.get('相關的別名名稱')便可獲取到值,eg:result.get('goodsPriceTotal')便可得到當前記錄的商品總價格。
另外須要注意的是:獲取記錄條數的函數有兩種,一種爲count(),一種爲count(field name)。當使用Database.countQuery(sql statement)狀況下sql語句中使用count(),其餘狀況下建議使用count(field name),此種寫法相似於sql語句中的count(*)。而且若是sql語句中含有group by,則不能使用count()函數。
二. 日期相關處理函數
在數據查詢中,咱們不少時候須要經過日期進行數據過濾。這時,使用soql的函數或者常量操做會更加便捷。主要函數和常量以下:
CALENDAR_YEAR(field name):返回字段對應的年,此字段參數類型能夠爲Datetime類型也能夠爲Date類型,返回類型爲Number類型。
eg:select Id from Account where CALENDAR_YEAR(CreatedDate) = 2016 -->查詢建立時間爲2016年的Account
CALENDAR_QUARTER(field name):返回字段對應的季度,其中1表明1月1日-3月31日,2表明4月1日到6月30日,3表明7月1日到9月30日 ,4表明10月1日到12月31日。
此字段類型返回的結果爲1-4之間的數字,適用於Datetime或者Date類型。
select Id from Account where CALENDAR_YEAR(CreatedDate) = 2016 and CALENDAR_QUARTER(CreatedDate) = 2 -->查詢建立時間爲2016年第二季度的Account
CALENDAR_MONTH(field name):返回參數對應的月,取值範圍1--12
DAY_IN_MONTH(field name):返回參很多天期中月份對應的日,好比參數若是是2016-02-25 則值返回25.
select count(Id) accountCount from Account where DAY_IN_MONTH(CreatedDate) < 20 group by CALENDAR_YEAR(CreatedDate) -->查詢建立的天小於每月20日的Account,經過年進行分組
DAY_IN_WEEK(field name):返回參很多天期中周對應的日,1表明週日,2表明週一,以此類推,7表明週六。
DAY_IN_YEAR(field name):返回參很多天期中當前日期在一年(365天)中對應的天數,例如若是是2月1日,則返回32
DAY_ONLY(field name):返回Datetime類型參數對應的Date類型日期。此方法能夠實現Datetime類型到Date類型的轉換,若是在數據表中,一個Datetime類型須要和一個Date類型做比較,即可以使用DAY_ONLY函數將Datetime類型轉換成Date類型。
除了正常的Calendar年月日之外,還有相關的財政年月日,能夠自行查看。
HOUR_IN_DAY(field name):返回datetime類型參數中小時數,此參數只能是Datetime類型。
還有不少經常使用的函數,詳細看API
三.日期處理經常使用常量
數據查詢中,有的時候使用常量會減小不少的參數傳遞,好比想要查CreatedDate爲本年的數據,若是不適用SOQL自帶的常量,則sql查詢時,便須要apex代碼中傳遞過來當前的年,而後經過CALENDAR_YEAR(CreatedDate)獲取當年的匹配,可是若是使用常量,即可以直接CreatedDate = THIS_YEAR搞定問題。
經常使用常量以下所示:
YESTERDAY: 昨天 select Id from Account where CreatedDate = YESTERDAY -->查詢建立日期爲昨天的Account記錄
TODAY : 今天
TOMORROW : 明天
NEXT_N_DAYS:n 超過今天第n天 SELECT Id FROM Opportunity WHERE CloseDate > NEXT_N_DAYS:2 -->查詢關閉日期超事後天的Opportunity
THIS_WEEK : 本週
THIS_MONTH : 本月
NEXT_N_MONTH:n 超過本月第n月
THIS_QUARTER : 本季度
THIS_YEAR : 本年
總結:此篇只是列舉部分函數以及常量,若是須要詳細自行參看官方PDF,若是內容有錯誤地方歡迎批評指正,若是有問題歡迎留言。