我怎样才能使这个 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
我有代码可以确定每年 "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