salesforce 零基础学习(三十九) soql函数以及常量
在salesforce中,我们做SOQL查询时,往往需要用到计算式,比如求和,求平均值,或者过滤数据时,往往需要通过时间日期过滤,SOQL已经封装了很多的函数,可以更加方便我们的sql查询而不需要自己另外设计。
一. 聚合函数
常用的聚合函数有如下几种:
AVG():求平均值
COUNT():求记录个数
COUNT_DISTINCT():求不重复记录个数
MIN():求记录中最小值
MAX():求记录中的最大值
SUM():求和
这些聚合函数通常和group by fieldName 一起用,达到分组目的。
下面以Goods__c表进行简单介绍,在Goods表里面新增了四条数据,揭下来通过GoodsBrand对Goods进行分组,求GoodsPrice的总和,平均值,最大值,最小值以及此种GoodsBrand所拥有的条数。
代码如下所示:
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';
List<AggregateResult> aggregateResults = Database.query(fetchGoodsAggregate);
for(AggregateResult result : aggregateResults) {
system.debug(JSON.serializePretty(result));
}
结果如下所示:
{
"attributes" : {
"type" : "AggregateResult"
},
"GoodsBrand__c" : "华为",
"goodsPriceTotal" : 5000.0,
"goodsPriceAvg" : 2500.0,
"recordCount" : 2,
"goodsPriceMin" : 2000.000000,
"goodsPriceMax" : 3000.000000
} {
"attributes" : {
"type" : "AggregateResult"
},
"GoodsBrand__c" : "小米",
"goodsPriceTotal" : 3000.0,
"goodsPriceAvg" : 1500.0,
"recordCount" : 2,
"goodsPriceMin" : 1000.000000,
"goodsPriceMax" : 2000.000000
}
上述代码中,我们看到了一个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,如果内容有错误地方欢迎批评指正,如果有问题欢迎留言。
salesforce 零基础学习(三十九) soql函数以及常量的更多相关文章
- salesforce 零基础学习(十九)Permission sets 讲解及设置
Permission sets以及Profile是常见的设置访问权限的方式. Profile规则为'who see what'.通过Profile可以将一类的用户设置相同的访问权限.对于有着相同Pro ...
- salesforce零基础学习(九十九)Git 在salesforce项目中的应用(vs code篇)
本篇参考: https://code.visualstudio.com/docs/editor/versioncontrol https://git-scm.com/doc https://git-s ...
- salesforce 零基础学习(十八)WorkFlow介绍及用法
说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配置workflow来完成以上 ...
- salesforce 零基础学习(十六)Validation Rules & Date/time
上一篇介绍的内容为Formula,其中的Date/time部分未指出,此篇主要介绍Date/time部分以及Validation rules. 本篇参考PDF: Date/time:https://r ...
- salesforce零基础学习(九十九)Salesforce Data Skew(数据倾斜)
本篇参考: https://developer.salesforce.com/blogs/engineering/2013/04/managing-lookup-skew-to-avoid-recor ...
- salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...
- salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现
项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...
- salesforce 零基础学习(五十二)Trigger使用篇(二)
第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...
- salesforce 零基础学习(六十八)http callout test class写法
此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...
- salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见
项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...
随机推荐
- [转]JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
原文引自: http://blog.csdn.net/castle07/article/details/8553704 今天尝试使用JUnit,下载了最新的JUnit版本,是4.11,结果尝试使用发现 ...
- nginx简易安装
yum -y install perl-ExtUtils-Embed ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx ...
- 天气预报API(一):全国城市代码列表(“旧编码”)
说明 2016-12-09 补充 (后来)偶然发现中国天气网已经有城市ID列表的网页... 还发现城市编码有两种,暂且称中国天气网这些编码为旧标准 "旧编码"的特征是 9个字符长度 ...
- padding(内边距)、margin(外边距)、border(边框)
元素的 padding 控制元素内容 content和元素边框 border 之间的距离. 元素的外边距 margin 控制元素边框 border 和元素实际所占空间的距离,如果你将一个元素的 mar ...
- arch下的启动问题解决
1.不知什么时候开始关机的时候会看到一串红色的文字 [lun. avril 20 09:15:34 2015] [drm:intel_uncore_check_errors [i915]] *ERRO ...
- angular+requirejs前端整合
requirejs或者seajs我相信在前端的开发工作中经常使用到,而angular,这个强大的web前端框架很多公司也在引入.本文主要记录自己在工作学习中如何对angular跟requirejs进行 ...
- Ubuntu下移植OpenCv
通过近一周的时候终于成功交叉编译opencv成功了,真心不容易.有一句话乃真理也,凡事贵在坚持.过程总是痛苦的,因为不懂得很多问题但是又需要面对很多问题,最大的收获就是耐心解决所有问题后就懂得这些了. ...
- Java学习笔记四——运算符
算术运算符 加减乘除(+.-.*./)就不说了. 求余运算符% 描述:第一个操作数除以第二个操作数,得到一个整除的结果后剩下的值就是余数 注意:求余预算的结果不一定总是整数,当操作数是浮点数时,结果可 ...
- Android中NDK的搭建及简单使用 Android.mk相关介绍 JNI的使用
Android中NDK的搭建及简单使用: 使用NDK,简述其重要步骤:.搭建NDK环境(作用:用于自动生成jni下的.c对应的so文件)---到Android NDK官网或Android官网下载ndk ...
- Android 把电话保存到现有联系人 已有联系人
搜索了很长时间,想找个把电话保存到现有联系人的代码,就是打开选中的联系人编辑界面,然后自动添加电话,再手动保存,就跟手机上的一样,功夫不负有心人,终于给搜到了,很不容易啊,现分享如下, // 保存至现 ...