SOQL聚合查询:计算返回的行数

时间:2012-08-21 21:22:18

标签: salesforce apex-code soql force.com

以下是我的SOQL查询:

select COUNT(Id) FROM Payroll_Group_Detail__c where Tax_Batch__c=null and CreatedDate >=2012-07-21T00:00:00-05:00 and Total_Tax_Amount__c!=null GROUP By Company__c,Name,Payment_Date__c,Pay_Cycle_Type__c;

我正在尝试计算此group by子句返回的行数。但是我没有得到一个计数,而是获得了多行。如何获取此分组返回的行的总计数?

谢谢, 卡尔文

4 个答案:

答案 0 :(得分:8)

只计算记录:

Integer counter = [ Select count() 
                    FROM Payroll_Group_Detail__c 
                    Where Tax_Batch__c = null 
                    And CreatedDate >= 2012-07-21T00:00:00-05:00 
                    And Total_Tax_Amount__c != null ];

System.debug('My counted records: ' + counter);

使用GROUP BY:

AggregateResult[] aggr = [ Select count(Id) 
                           FROM Payroll_Group_Detail__c 
                           Where Tax_Batch__c = null 
                           And CreatedDate >= 2012-07-21T00:00:00-05:00 
                           And Total_Tax_Amount__c != null
                           Group By Total_Tax_Amount__c ];

Integer counter = Integer.valueOf(aggr.size());

System.debug('#### counter: ' + counter);

但请记住,您不能超过允许的州长限制(SOQL查询检索的记录总数 - > 50,000)

答案 1 :(得分:2)

分组会为分组字段中的每个唯一值返回一行。

Salesforce Group By documentation

如果您想要在7月21日之后创建的Payroll_Group_Detail__c的总数,其中Tax_Branch__c为空但设置了Total_Tax_Amount__c,则只需松开Group By语句。

答案 2 :(得分:1)

对于像我这样寻求帮助的其他可怜人 - 如果在聚合函数之后没有使用别名,请使用:

Object counter = aggr[0].get('expr0');

如果您在聚合函数之后使用了别名,则可以使用:

Object counter = aggr[0].get('myalias');

请参阅文档:Working with SOQL Aggregate Functions

答案 3 :(得分:0)

我不认为aggr.size是你需要的

Integer counter = Integer.valueOf(aggr.size());

计数在AggregateResult对象的expr0字段中返回。     aggr.get( 'expr0')

会工作吗? 如果您有其他字段返回计数,请参阅以下链接中的示例

How do I display the results of an aggregate SOQL query on a Visualforce page?