SQL Применение параметра вместо жесткого кодирования - PullRequest
2 голосов
/ 01 ноября 2010

Мне нужна небольшая помощь, у меня есть отчет, который я создаю, который только извлекает определенную информацию, основанную на ряде «категорий», которые жестко закодированы.Однако я хочу сделать это максимально гибким и заменить эти кодированные категории параметром, который может быть выбран пользователем.Однако, когда я пытаюсь это сделать, это никогда не срабатывает по разным причинам.Текущий код:

    SELECT          gcs_allocatedpdaidname AS PDA,
        gcs_consideringapplyingyearname AS 'Intending to Start ITT', 
        SUM(CASE WHEN (gcs_allocatedpdaid IS NOT NULL) AND (gcs_ContactType = 1) THEN 1 ELSE 0 END) AS 'Total Participants',
        SUM(CASE WHEN (gcs_allocatedpdaid IS NOT NULL) AND (gcs_ContactType = 1) AND (StatusCode = 1) THEN 1 ELSE 0 END) AS 'Active Participants', 
        SUM(CASE WHEN (gcs_allocatedpdaid IS NOT NULL) AND (gcs_ContactType = 1) AND (StatusCode = 200001) THEN 1 ELSE 0 END) AS 'Completed Participants', 
        SUM(CASE WHEN (gcs_allocatedpdaid IS NOT NULL) AND (gcs_ContactType = 1) AND ((gcs_categoryofparticipant = 7) OR
                            (gcs_categoryofparticipant = 8) OR
                            (gcs_categoryofparticipant = 9) OR
                            (gcs_categoryofparticipant = 10) OR
                            (gcs_categoryofparticipant = 11) OR
                            (gcs_categoryofparticipant = 12)) THEN 1 ELSE 0 END) AS 'On ITT and beyond TOTAL',

        SUM(CASE WHEN (gcs_allocatedpdaid IS NOT NULL) AND (gcs_ContactType = 1) AND ((StatusCode = 1) OR (StatusCode = 200001)) THEN 1 ELSE 0 END) AS 'On ITT and beyond ACTIVE/COMPLETE'

FROM            FilteredContact
GROUP BY gcs_allocatedpdaidname, gcs_allocatedpdaid, gcs_consideringapplyingyearname
HAVING        (gcs_allocatedpdaidname IN (@PDA)) AND (gcs_consideringapplyingyearname IN (@ITTYear))
ORDER BY PDA, 'Intending to Start ITT'

Жесткое кодирование, которое я хочу заменить, - это 'gcs_categoryofparticipant', см. Ниже:

SUM(CASE WHEN (gcs_allocatedpdaid IS NOT NULL) AND (gcs_ContactType = 1) AND
                                ((gcs_categoryofparticipant = 7) OR
                                (gcs_categoryofparticipant = 8) OR
                                (gcs_categoryofparticipant = 9) OR
                                (gcs_categoryofparticipant = 10) OR
                                (gcs_categoryofparticipant = 11) OR
                                (gcs_categoryofparticipant = 12)) THEN 1 ELSE 0 END) AS 'On ITT and beyond TOTAL'

Я думаю, это будет что-то вроде:

SUM(CASE WHEN (gcs_allocatedpdaid IS NOT NULL) AND (gcs_ContactType = 1) AND (HAVING (gcs_categoryofparticipant IN (@Category))) THEN 1 ELSE 0 END) AS 'On ITT and beyond TOTAL'

Это, очевидно, не работает, но если бы кто-то мог указать мне правильное направление, это было бы очень признательно.

Спасибо

1 Ответ

2 голосов
/ 01 ноября 2010

HAVING не требуется ни в сумме, ни в конце запроса - HAVING в конце запроса можно изменить на WHERE, тогда как SUM может быть:

SUM(CASE WHEN (gcs_allocatedpdaid IS NOT NULL) AND 
              (gcs_ContactType = 1) AND 
              (gcs_categoryofparticipant IN (@Category)) 
         THEN 1 
         ELSE 0 
    END) AS 'On ITT and beyond TOTAL'
...