Using AggregateResult in Salesforce
Biswajeet
February 25, 2014 No Comments on Using AggregateResult in Salesforce
The aggregate functions COUNT(fieldname)
, COUNT_DISTINCT()
, SUM()
, AVG()
, MIN()
and MAX()
in SOQL return an AggregateResult
object or a List of AggregateResult
objects. We can use aggregate functions result in apex by using AggregateResult
object.
Here is an example to use AggregateResult
in Salesforce. In below example I’m using COUNT(fieldname)
aggregate function in SOQL to show Account record respective number of Contacts.
Visualforce Page:
<apex:page controller="SampleController" action="{!getData}"> <apex:form > <apex:pageBlock > <apex:pageblockTable value="{!accWrapList}" var="acc"> <apex:column headerValue="Account Name" value="{!acc.AccountName}"/> <apex:column headerValue="Number of Contacts" value="{!acc.TotalContact}"/> </apex:pageblockTable> </apex:pageBlock> </apex:form> </apex:page>
Apex Class:
public with sharing class SampleController { public List<AggregateResult> result {get;set;} public List<AccWrapper> accWrapList {get;set;} public List<Account> accList; public Map<Id, Account> accMap; List<Id> idList; public void getData() { accWrapList = new List<AccWrapper>(); result = new List<AggregateResult>(); idList = new List<Id>(); accList = new List<Account>(); accMap = new Map<Id, Account>(); result = [SELECT COUNT(Id) Total, AccountId FROM Contact WHERE AccountId != null GROUP BY AccountId]; for(AggregateResult a : Result) { idList.add((Id)a.get('AccountId')); } accList = [SELECT Id, Name FROM Account WHERE Id IN : idList]; for(Account a : accList) { accMap.put(a.Id, a); } for(AggregateResult aResult : result) { Account acc = accMap.get((Id)(aResult.get('AccountId'))); accWrapList.add(new AccWrapper(aResult, acc.Name)); } } public class AccWrapper { public Integer TotalContact {get;set;} public String AccountName {get;set;} public AccWrapper(AggregateResult a, String AccountName) { this.TotalContact = (Integer)a.get('Total'); this.AccountName = AccountName; } } }