Кампании soql salesforce с влиятельными возможностями

Я пытаюсь создать запрос SOQL, который возвращает список кампаний с влиятельными возможностями, аналогичный стандартному отчету о кампании с тем же именем. Следующее, похоже, не возвращает те же значения, что и отчет:

SELECT Id,Name FROM Opportunity
where CampaignId in (SELECT CampaignId from CampaignMember where CampaignId = '??')

Любая помощь будет принята с благодарностью.


person rms58    schedule 28.11.2012    source источник


Ответы (1)


Если вам нужно что-то простое - этого может быть достаточно:

SELECT Campaign.Name, Id, Name, Amount
FROM Opportunity
WHERE CampaignId != null AND CloseDate = THIS_MONTH

Вы можете легко преобразовать его в агрегированный запрос, который также даст вам итоговые данные по кампании:

SELECT Campaign.Name, Campaign.NumberOfOpportunities, SUM(Amount), COUNT(Id)
FROM Opportunity
WHERE CampaignId != null AND CloseDate = THIS_MONTH
GROUP BY Campaign.Name, Campaign.NumberOfOpportunities

(если вы получите несоответствие между Campaign.NumberOfOpportunities и количеством Opps, все в порядке. Это потому, что первое поле является «счетчиком за все время», а на последнее влияет WHERE CloseDate = THIS_MONTH)


Если вам нужен весь набор данных в том виде, в каком он был возвращен в отчете (особенно «Ответили»), это будет сложно, потому что Диаграмма ERD для этих объектов немного неприятна.

Влияние кампании позволяет маркетологам измерять и составлять отчеты по нескольким кампаниям, которые повлияли на одну возможность.

Итак, мы могли бы как-то начать с контакта, перейти к возможностям через OpportunityContactRole. И в то же время из Контакта перейдите в CampaignMembers к Campaign.

SELECT Name, Email, Account.Name, 
    (SELECT HasResponded, Campaign.Name FROM CampaignMembers),
    (SELECT Opportunity.Name, Opportunity.Amount FROM OpportunityContactRoles)
FROM Contact 
LIMIT 10

Однако вам придется обработать результаты запроса, чтобы получить названия кампаний (и я не думаю, что подзапросы можно экспортировать, например, с помощью загрузчика данных).


И последнее, но не менее важное: если вас интересует только одна кампания или только одна Opp, ее можно упростить (и вы были довольно близки!)

SELECT Contact.Name, Opportunity.Account.Name, Opportunity.Name, Opportunity.Amount
FROM OpportunityContactRole
WHERE ContactId IN (SELECT ContactId FROM CampaignMember WHERE Campaign.Name = 'Sample Campaign')
person eyescream    schedule 28.11.2012
comment
Спасибо за быстрый и подробный ответ. Это было чрезвычайно полезно. - person rms58; 28.11.2012
comment
Ваш последний пример ближе всего к тому, что я ищу, но я застрял, потому что он возвращает список всех возможностей для контакта, а не только возможность, привязанную к кампании в предложении WHERE. - person rms58; 29.11.2012
comment
Тогда добавьте ... AND Opportunity.Campaign.Name = 'Sample Campaign' в конце? - person eyescream; 29.11.2012
comment
Еще раз спасибо. Я пробовал это, но возможность сейчас совсем не отображается. Когда я запрашиваю объект Opportunity, который отображается в отчете, я вижу, что поле CampaignId пусто. Итак, перед добавлением предложения AND я вижу все возможности для контакта, но я не знаю, как ограничить запрос, чтобы вернуть кампанию, которую я ищу. - person rms58; 29.11.2012
comment
Боюсь, что мы можем только так много попробовать: / Эти отчеты особенные, должна быть какая-то более простая таблица отношений, которую они нам не раскрывают (влияние учитывается только до закрытия Opp, но все мои запросы дадут вам ложные срабатывания если вы добавите контактные роли в Opp после его закрытия) ... Вы можете точно настроить это с помощью фильтрации на основе Apex или изучить историю полей на объектах, чтобы вручную получить точные результаты ... Но это выходит за рамки 1 простого запрос. Вы всегда можете попросить поддержки о помощи? ;) - person eyescream; 29.11.2012
comment
Спасибо за вашу помощь. Я попробовал поддержку SF, но мне было предложено разместить сообщения на форумах разработчиков. Там были опубликованы некоторые вопросы о влиянии кампании, но они мало помогли. Я отправлю ответ, если / когда у меня это сработает. - person rms58; 29.11.2012