我怎样才能使这个 SQL 服务器脚本多年来一直动态?

How can I make this SQL Server script dynamic through the years?

我有代码可以确定每年 "lapsed" 捐赠者的数量。我结合了每年捐助者使用工会失效的情况。我希望这些数据每年自动更新而不添加联合。有没有办法让岁月变得动态?

我只使用了当前的静态脚本,我必须从 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 年。

基本聚合不起作用吗?我会认为这就是你所追求的。

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

不确定这将取决于您的数据集的大小,但相关的子查询应该得到您想要的结果:

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