Просто SQL запрос - PullRequest
       4

Просто SQL запрос

0 голосов
/ 16 октября 2018

У меня есть сценарий SQL, и я хотел бы иметь несколько счетчиков, в зависимости от различных предложений where, вместо повторения, например, есть ли способ упростить это?

select
    UnverifiedEmails = 
        (
            select count(distinct c.ContactRef) 
            from ContactEmailAddressVerification c
            LEFT JOIN EmailAddressVerification e
            ON e.EmailAddressVerificationID = c.EmailAddressVerificationID
            WHERE DateVerified IS NULL
        ),
    VerifiedEmails =
        (
            select count(distinct c.ContactRef) 
            from ContactEmailAddressVerification c
            LEFT JOIN EmailAddressVerification e
            ON e.EmailAddressVerificationID = c.EmailAddressVerificationID
            WHERE DateVerified IS NOT NULL
        ),
    LastMonthVerified =
        (
            select count(distinct c.ContactRef) 
            from GDPR_ContactEmailAddressVerification c
            LEFT JOIN EmailAddressVerification e
            ON e.EmailAddressVerificationID = c.EmailAddressVerificationID
            WHERE DateVerified IS NOT NULL
            AND DATEPART(m, e.DateAdded) = DATEPART(m, DATEADD(m, -1, getdate()))
        ),
    LastMonthUnverified =
        (
            select count(distinct c.ContactRef) 
            from ContactEmailAddressVerification c
            LEFT JOIN EmailAddressVerification e
            ON e.EmailAddressVerificationID = c.EmailAddressVerificationID
            WHERE DateVerified IS NULL
            AND DATEPART(m, e.DateAdded) = DATEPART(m, DATEADD(m, -1, getdate()))
        )

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Вы можете выполнить агрегирование с помощью одного оператора SELECT:

SELECT COUNT(DISTINCT CASE WHEN DateVerified IS NULL THEN c.ContactRef END) UnverifiedEmails,
       COUNT(DISTINCT CASE WHEN DateVerified IS NOT NULL THEN c.ContactRef END) VerifiedEmails,
       COUNT(DISTINCT CASE WHEN (DateVerified IS NOT NULL AND 
                                 DATEPART(m, e.DateAdded) = DATEPART(m, DATEADD(m, -1, getdate()))
                                ) 
                           THEN c.ContactRef
             END) LastMonthVerified,
       COUNT(DISTINCT CASE WHEN (DateVerified IS NULL AND 
                                 DATEPART(m, e.DateAdded) = DATEPART(m, DATEADD(m, -1, getdate()))
                                ) 
                           THEN c.ContactRef 
             END) LastMonthUnverified 
FROM ContactEmailAddressVerification c LEFT JOIN 
     EmailAddressVerification e
     ON e.EmailAddressVerificationID = c.EmailAddressVerificationID;
0 голосов
/ 16 октября 2018

Вы можете использовать условное агрегирование:

SELECT
    COUNT(DISTINCT CASE WHEN DateVerified IS NULL
                        THEN c.ContactRef END) AS UnverifiedEmails,
    COUNT(DISTINCT CASE WHEN DateVerified IS NOT NULL
                        THEN c.ContactRef END) AS VerifiedEmails,
    COUNT(DISTINCT CASE WHEN DateVerified IS NOT NULL AND
        DATEPART(m, e.DateAdded) = DATEPART(m, DATEADD(m, -1, GETDATE()))
                        THEN c.ContactRef END) AS LastMonthVerified,
    COUNT(DISTINCT CASE WHEN DateVerified IS NULL AND
        DATEPART(m, e.DateAdded) = DATEPART(m, DATEADD(m, -1, GETDATE()))
                        THEN c.ContactRef END) AS LastMonthUnverified
FROM ContactEmailAddressVerification c
LEFT JOIN EmailAddressVerification e
    ON e.EmailAddressVerificationID = c.EmailAddressVerificationID;

Идея состоит в том, чтобы сделать один проход по объединенным таблицам, а затем условно взять суммы / суммы, в зависимости от логики в каждом из * 1004.* пункты вашего исходного запроса.

0 голосов
/ 16 октября 2018

вариант использования, когда не требуется несколько подзапросов

select  count(distinct case when DateVerified IS NULL then  c.ContactRef end) UnverifiedEmails ,
        count(distinct case when DateVerified IS not NULL then  c.ContactRef end) VerifiedEmails,
        count(distinct case when DateVerified IS NOT NULL
                     AND DATEPART(m, e.DateAdded) = DATEPART(m, DATEADD(m, -1, getdate()))
                     then  c.ContactRef end ) LastMonthVerified,
        count(distinct case when DateVerified IS NULL
                     AND DATEPART(m, e.DateAdded) = DATEPART(m, DATEADD(m, -1, getdate()))
                     then  c.ContactRef end) LastMonthUnverified

                from ContactEmailAddressVerification c
                LEFT JOIN EmailAddressVerification e
                ON e.EmailAddressVerificationID = c.EmailAddressVerificationID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...