Как я могу сделать этот сценарий SQL Server динамичным в течение многих лет? - PullRequest
0 голосов
/ 21 мая 2019

У меня есть код, который определяет количество «потерянных» доноров за каждый год. Я объединил каждый год, что доноры перестали использовать союзы. Я хотел бы, чтобы эти данные автоматически обновлялись каждый год без добавления в объединение. Есть ли способ, чтобы годы были динамичными?

Я использовал только текущий статический скрипт, который мне нужно, чтобы вытащить всех просроченных доноров с 2013 года. Предоставленный скрипт показывает 2017-2019.

--Donated 2018, Not 2019
SELECT DISTINCT 
    PY.OppFiscalYear, COUNT(DISTINCT PY.AccountId)
FROM
    (SELECT DISTINCT PY.AccountId, PY.OppFiscalYear
     FROM reporting.AllGifts PY
     WHERE PY.OppFiscalYear = '2018'
       AND PY.OpportunityRecordType IN ('Classy', 'Donation', 'Pledge')
       AND PY.AccountRecordType = 'Household'
       AND PY.OppStage = 'Paid') PY
LEFT JOIN
    (SELECT DISTINCT Y.AccountId
     FROM reporting.AllGifts Y
     WHERE Y.OppFiscalYear = '2019'
       AND Y.OpportunityRecordType IN ('Classy', 'Donation', 'Pledge')
       AND Y.AccountRecordType = 'Household'
       AND Y.OppStage = 'Paid') Y ON PY.ACCOUNTID = Y.ACCOUNTID
WHERE 
    Y.AccountId IS NULL
GROUP BY 
    PY.OppFiscalYear

UNION

--Donated 2017, Not 2018
SELECT DISTINCT 
    PY.OppFiscalYear, COUNT(DISTINCT PY.AccountId)
FROM
    (SELECT DISTINCT PY.AccountId, PY.OppFiscalYear
     FROM reporting.AllGifts PY
     WHERE PY.OppFiscalYear = '2017'
       AND PY.OpportunityRecordType IN ('Classy', 'Donation', 'Pledge')
       AND PY.AccountRecordType = 'Household'
       AND PY.OppStage = 'Paid') PY
LEFT JOIN
    (SELECT DISTINCT Y.AccountId
     FROM reporting.AllGifts Y
     WHERE Y.OppFiscalYear = '2018'
       AND Y.OpportunityRecordType IN ('Classy', 'Donation', 'Pledge')
       AND Y.AccountRecordType = 'Household'
       AND Y.OppStage = 'Paid') Y ON PY.ACCOUNTID = Y.ACCOUNTID
WHERE 
    Y.AccountId IS NULL
GROUP BY 
    PY.OppFiscalYear

Я ожидаю того же результата, что и в настоящее время, но я хочу, чтобы он мог автоматически включать любые новые пожертвования, добавляемые изо дня в день. Если бы я продолжал использовать свой текущий метод, новый сценарий, который нужно было бы добавить в верхнюю часть с объединением, предназначен для 2019 и 2020 годов.

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Не уверен, насколько это будет эффективно, в зависимости от размера вашего набора данных, но коррелированный подзапрос должен получить желаемые результаты:

SELECT PY.OppFiscalYear, COUNT(DISTINCT PY.AccountId)
FROM reporting.AllGifts PY
WHERE 
PY.OpportunityRecordType IN ('Classy', 'Donation', 'Pledge')
        AND PY.AccountRecordType= 'Household'
        AND PY.OppStage = 'Paid'
AND NOT EXISTS
    (SELECT 1 FROM  reporting.AllGifts Y
WHERE 
Y.OpportunityRecordType IN ('Classy', 'Donation', 'Pledge')
        AND Y.AccountRecordType= 'Household'
        AND Y.OppStage = 'Paid'
AND Y.OppFiscalYear = PY.OppFiscalYear + 1
AND Y.AccountId = PY.AccountId)
AND OppFiscalYear <> (SELECT MAX(OppFiscalYear) FROM reporting.AllGift) -- Can't be lapsed from the latest year!
GROUP BY OppFiscalYear
0 голосов
/ 21 мая 2019

Не работает базовый агрегат?Я бы подумал, что это то, что вы ищете.

SELECT PY.OppFiscalYear
    , COUNT(DISTINCT PY.AccountId)
FROM reporting.AllGifts PY
WHERE PY.OpportunityRecordType IN ('Classy', 'Donation', 'Pledge')
    AND PY.AccountRecordType= 'Household'
    AND PY.OppStage = 'Paid'
group by PY.OppFiscalYear
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...