Здравствуйте.
Заранее извиняюсь за некропостинг, но ответа на форуме не нашёл (может плохо искал), а данный тред очень похож на мою проблему.
Задача.
Решил сделать красивый отчёт с "пирогом" по действиям в рамках CampaignActivity (действия кампании). То есть кастомизировал немного сущность Appointment (Встреча) добавив поля new_win (Положительный результат) и new_fail (Отрицательный результат) и на выходе получаю что-то вроде пирожка во вложении. Поля для него, в обычном варианте, вытаскиваются таким запросом:
Код:
SELECT
COUNT(*) AS kolvo, 'Положительные' AS 'type', FA.regardingobjectidname AS subject
FROM
FilteredAppointment AS FA
INNER JOIN
FilteredCampaignActivity AS FCA
ON
FA.regardingobjectid = FCA.activityid
WHERE
(FA.new_win IS NOT NULL) AND (FCA.activityid = @id)
GROUP BY
FA.regardingobjectidname
UNION ALL
SELECT
COUNT(*) AS kolvo, 'Отрицательные' AS 'type', FA.regardingobjectidname AS subject
FROM
FilteredAppointment AS FA
INNER JOIN
FilteredCampaignActivity AS FCA
ON
FA.regardingobjectid = FCA.activityid
WHERE
(FA.new_fail IS NOT NULL) AND (FCA.activityid = @id)
GROUP BY
FA.regardingobjectidname
UNION ALL
SELECT
COUNT(*) AS kolvo, 'Не начатые' AS 'type', FA.regardingobjectidname AS subject
FROM
FilteredAppointment AS FA
INNER JOIN
FilteredCampaignActivity AS FCA
ON
FA.regardingobjectid = FCA.activityid
WHERE
(FA.new_fail IS NULL) AND (FA.new_win IS NULL) AND (FCA.activityid = @id)
GROUP BY
FA.regardingobjectidname
В BIS всё работает хорошо и без вопросов. Теперь я хочу сделать немного удобства и запускать данный отчёт непосредственно с формы "Действия кампании" и динамически подставлять туда выделенную(ые) запись(и). Естественно автоматическая фильтрация по CRMAF_ тут работать не будет. Поэтому я полез по форумам и SDK за примерами жёсткой предварительной фильтрации. Но при попытки переписать данный, статичный, запрос под динамичный, наткнулся на грабли (ибо молод и неопытен) как же подружить столько WHERE в одном запросе. Так как, если я правильно понял примеры и общий смысл, то в параметр как раз и подставляется он самый.
Собственно динамический запрос (простите если разнесу разметку форума):
Код:
DECLARE @CRM_CampaignActivity VarChar(Max)
DECLARE @SQL VarChar(Max)
SET @CRM_CampaignActivity = 'SELECT FilteredCampaignActivity.activityid FROM FilteredCampaignActivity'
SET @SQL =
'SELECT COUNT(*) AS kolvo, FA.regardingobjectidname AS subject FROM FilteredAppointment AS FA INNER JOIN ('+@CRM_CampaignActivity+') AS FCA ON FA.regardingobjectid = FCA.activityid WHERE (FA.new_win IS NOT NULL) AND (FCA.activityid in ('+@CRM_CampaignActivity+')) GROUP BY FA.regardingobjectidname
UNION ALL
SELECT COUNT(*) AS kolvo, FA.regardingobjectidname AS subject FROM FilteredAppointment AS FA INNER JOIN ('+@CRM_CampaignActivity+') AS FCA ON FA.regardingobjectid = FCA.activityid WHERE (FA.new_fail IS NOT NULL) AND (FCA.activityid in ('+@CRM_CampaignActivity+')) GROUP BY FA.regardingobjectidname
UNION ALL
SELECT COUNT(*) AS kolvo, FA.regardingobjectidname AS subject FROM FilteredAppointment AS FA INNER JOIN ('+@CRM_CampaignActivity+') AS FCA ON FA.regardingobjectid = FCA.activityid WHERE (FA.new_fail IS NULL) AND (FA.new_win IS NULL) AND (FCA.activityid in ('+@CRM_CampaignActivity+')) GROUP BY FA.regardingobjectidname'
EXEC (@SQL)
Проблем у этого запроса две.
Первая: Фильтрации данных не происходит. Всегда возвращаются все записи по всем Действиям кампаний.
Вторая: Ругается на конструкцию вида
'Положительные' AS 'type'. Говорит некорректный синтаксис. Как экранировать эту конструкцию? Или хотя бы скажите как называется она (выборка несуществующего поля?) чтобы я мог погуглить. Заранее благодарю за ответы.