在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,若是内容有错误地方欢迎批评指正,若是有问题欢迎留言。