Я пытаюсь подсчитать количество лиц, имеющих более 1 подписки с помощью SOQL. Естественно, я написал такой запрос, обратите внимание, что Optin является дочерним элементом учетной записи:

SELECT count(AccountId) 
FROM Account 
WHERE AccountId IN ( SELECT AccountId 
                     FROM Optin 
                     GROUP BY AccountId 
                     HAVING COUNT Count(OptinId) > 1
                   )

У меня возникает эта ошибка, когда я пытаюсь выполнить ее:

MALFORMED_QUERY: 
Consumer__c FROM Email_Optin__c GROUP BY Consumer__c HAVING COUNT
ERROR at Row:1:Column:80
expecting a right parentheses, found 'GROUP'

Заранее спасибо за вашу помощь!

1
Jackson Chen 28 Июн 2019 в 17:38
Есть ли у вас какая-либо связь между account и Option?
 – 
sdandamud1
28 Июн 2019 в 15:46
Да, Optin — дочерняя учетная запись: я только что обновил свой вопрос :)
 – 
Reda Maachi
28 Июн 2019 в 15:46
Вы можете выполнить агрегированный запрос для каждого дочернего объекта по отдельности, например SELECT count(id), AccountId FROM Optin GROUP BY AccountId
 – 
sdandamud1
28 Июн 2019 в 15:50
Ваше решение действительно подсчитывает количество Optin на учетную запись, я хочу сделать общее количество учетных записей с более чем 1 Optin.
 – 
Reda Maachi
28 Июн 2019 в 15:55

1 ответ

Salesforce не поддерживает Group BY или HAVING во внутреннем запросе.

Итак, вам нужно создать 2 отдельных запроса следующим образом:

List<Id> acctIds =  [SELECT AccountId 
                     FROM Optin 
                     GROUP BY AccountId 
                     HAVING COUNT (Id) > 1];

List<AggregateResult> results = [SELECT count(Id) 
                                FROM Account 
                                WHERE AccountId IN :acctIds];

Или нет необходимости выполнять второй запрос для получения результатов.

Просто используйте acctIds.size(), чтобы получить количество аккаунтов.

2
Santanu Boral 28 Июн 2019 в 16:31
Спасибо ! То есть нет возможности сделать это в редакторе запросов?
 – 
Reda Maachi
28 Июн 2019 в 17:51