使用 SQL 聚合派生值
Aggregate derived values with SQL
我正在使用 SQL Server 2012。我已尽我所能进行了此查询。如您所见,我使用 CTE 导出值,然后在 select 语句中使用导出值。在此示例中,当我连接 Quarter +Year = Period
时,这只会发生一次
我可以在 SSRS 报告的数据集中使用此查询来实现我想要的分组,但我想知道如何在 SQL 中执行此操作。当我需要派生数据然后对这些派生执行其他功能时,我一直在努力。 CTE 是一种方式。我在有限的程度上使用了 temp tables,但并不精通它们的用法。这是查询。
USE SampleDW
WITH gifts AS
(
SELECT ClientBriefName,AccountIDKey,AdventID,AccountName,AccountType,FlipProvision,FlipDate,ExpectedFlipDate,GiftCategory,GiftType,
GiftDate,GiftAmount,AssetClass,SecurityType,UserDefinedCode,
COALESCE(
CASE WHEN MONTH(giftdate)IN(1,2,3) THEN 'Q1' ELSE NULL END,
CASE WHEN MONTH(giftdate)IN(4,5,6) THEN 'Q2' ELSE NULL END,
CASE WHEN MONTH(giftdate)IN(7,8,9) THEN 'Q3' ELSE NULL END,
CASE WHEN MONTH(giftdate)IN(10,11,12) THEN 'Q4' ELSE NULL END
) AS Quarter,
CASE WHEN AccountType IN('CORP','ENDOW','OTHER','990','DCA','PRIV-TAX') THEN 'NO' ELSE 'YES' END AS ISPG,
YEAR(Giftdate) YEAR,
CASE WHEN AccountType IN('CRUT','CGA','CRUTNI','CRAT','PIF','NQI','CRUTMU','LEAD-PCT','LEAD-FIXED','GRANTOR-OWNER','PRE-69')
THEN 'YES' ELSE 'NO' END AS LIFEINCOME
FROM Generic.dbo.PO_GiftDetails
)
SELECT ClientBriefName,AccountIDKey,AdventID,AccountName,AccountType,FlipProvision,FlipDate,ExpectedFlipDate,GiftCategory,GiftType,
GiftDate,GiftAmount,AssetClass,SecurityType,UserDefinedCode, ISPG, QUARTER,YEAR,gifts.LIFEINCOME, CAST(Quarter AS VARCHAR)+CAST(YEAR AS varchar) AS Period
FROM gifts
结果集
ClientBriefName AccountIDKey AdventID AccountName AccountType FlipProvision FlipDate ExpectedFlipDate GiftCategory GiftType GiftDate GiftAmount AssetClass SecurityType UserDefinedCode ISPG QUARTER YEAR LIFEINCOME Period
Client1 103859 Jsmith John Smith CRUT 0 NULL NULL Standard Unitrusts New Trusts 00:00.0 82300 e lcus 1 YES Q4 2012 YES Q42012
Client1 100281 Jsmith John Smith CRAT 0 NULL NULL Additions to Trusts Additions to Trusts 00:00.0 5000 c caus 2 YES Q4 2012 YES Q42012
Client2 100281 JaSmith Jane Smith CRUT 0 NULL NULL Additions to Trusts Additions to Trusts 00:00.0 5000 c caus 2 YES Q4 2012 YES Q42012
Client2 100281 JaSmith Jane Smith CRAT 0 NULL NULL Additions to Trusts Additions to Trusts 00:00.0 2000 c caus 2 YES Q4 2012 YES Q42012
Client1 103859 Jsmith John Smith CRUT 0 NULL NULL Standard Unitrusts New Trusts 00:00.0 82300 e lcus 1 YES Q1 2012 YES Q12012
Client1 100281 Jsmith John Smith CRAT 0 NULL NULL Additions to Trusts Additions to Trusts 00:00.0 5000 c caus 2 YES Q1 2012 YES Q12012
Client2 100281 JaSmith Jane Smith CRUT 0 NULL NULL Additions to Trusts Additions to Trusts 00:00.0 5000 c caus 2 YES Q1 2012 YES Q12012
Client2 100281 JaSmith Jane Smith CRAT 0 NULL NULL Additions to Trusts Additions to Trusts 00:00.0 2000 c caus 2 YES Q1 2012 YES Q12012
如果我想实现类似 table 的枢轴输出怎么办?我之前在 sQL 中使用过 pivot,但我不确定我将如何以最简单的形式在此查询中使用。所需的输出将按客户对各种礼物类型求和进行分组,所有总和最后按期间
分组
AdventID Annuity Trusts Flip Trust Gift Annuity Pools Net Income Unitrusts Grand Total Period
CLIENT1 0 0 1187880.16 800 1188680.16 Q12012
CLIENT2 0 0 25014.6 500 25514.6 Q12012
CLIENT1 0 0 550123 800 550923 Q42012
CLIENT2 0 0 4851061 600 4851661 Q42012
继续进行聚合,因为您可以在派生的 table 或 CTE 上应用聚合。
下面我假设 GiftType
被分解为您的 post 中显示的所需结果的指定列。
WITH gifts AS
(
SELECT ClientBriefName, AccountIDKey, AdventID, AccountName, AccountType,
FlipProvision, FlipDate, ExpectedFlipDate, GiftCategory, GiftType,
GiftDate, GiftAmount, AssetClass, SecurityType, UserDefinedCode,
(CASE WHEN MONTH(GiftDate) IN (1, 2 ,3) THEN 'Q1' ELSE NULL END,
CASE WHEN MONTH(GiftDate) IN (4, 5, 6) THEN 'Q2' ELSE NULL END,
CASE WHEN MONTH(GiftDate) IN (7, 8, 9) THEN 'Q3' ELSE NULL END,
CASE WHEN MONTH(GiftDate) IN (10, 11, 12) THEN 'Q4' ELSE NULL END) AS Quarter,
CASE WHEN AccountType IN ('CORP','ENDOW','OTHER','990','DCA','PRIV-TAX')
THEN 'NO'
ELSE 'YES' END AS ISPG,
YEAR(Giftdate) AS [YEAR],
CASE WHEN AccountType IN ('CRUT','CGA','CRUTNI','CRAT','PIF','NQI','CRUTMU',
'LEAD-PCT', 'LEAD-FIXED','GRANTOR-OWNER','PRE-69')
THEN 'YES'
ELSE 'NO' END AS LIFEINCOME
FROM GenericDW.dbo.PO_GiftDetails
)
/* ADJUST AGGREGATES AS NEEDED */
SELECT AdventID, Sum(CASE WHEN GiftType = 'Annuity' THEN GiftAmount ELSE 0 END) As Annuity,
Sum(CASE WHEN GiftType = 'Trusts' THEN GiftAmount ELSE 0 END) As Trusts,
Sum(CASE WHEN GiftType = 'Flip Trust' THEN GiftAmount ELSE 0 END) As [Flip Trust],
Sum(CASE WHEN GiftType = 'Gift' THEN GiftAmount ELSE 0 END) As Gift,
Sum(CASE WHEN GiftType = 'Annuity Pools'
THEN GiftAmount ELSE 0 END) As [Annuity Pools],
Sum(CASE WHEN GiftType IN ('Annuity', 'Trusts', 'Flip Trust', 'Gift', 'Annuity Pools')
THEN GiftAmount ELSE 0) As [Net Income],
Sum(CASE WHEN GiftType = 'Unitrusts' THEN GiftAmount ELSE 0 END) As Unitrusts,
Sum(GiftAmount) As [Grand Total],
CAST([Quarter] + '-' + [Year] AS VARCHAR(100)) As [Period]
FROM gifts
GROUP BY AdventID, CAST([Quarter] + '-' + [Year] AS VARCHAR(100))
以及一个可能的关键解决方案
With gifts As ( ... )
SELECT AdventID, Sum([Annuity]), Sum([Trusts]), Sum([Flip Trust]),
Sum([Gift]), Sum([Annuity Pools]), Sum([Unitrusts]),
Sum([Annuity]) + Sum([Trusts]) + Sum([Flip Trust])
+ Sum([Gift]) + Sum([Annuity Pools]) As [Net Income],
Sum([GiftAmount]) As [Grand Total],
CAST([Quarter] + '-' + [Year] AS VARCHAR(100)) As [Period]
FROM gifts
PIVOT (
Sum([GiftAmount])
For [GiftType] In
([Annuity], [Trusts], [Flip Trust], [Gift], [Annuity Pools], [Unitrusts])
) AS pivotTable
GROUP BY AdventID, CAST([Quarter] + '-' + [Year] AS VARCHAR(100))
我正在使用 SQL Server 2012。我已尽我所能进行了此查询。如您所见,我使用 CTE 导出值,然后在 select 语句中使用导出值。在此示例中,当我连接 Quarter +Year = Period
时,这只会发生一次我可以在 SSRS 报告的数据集中使用此查询来实现我想要的分组,但我想知道如何在 SQL 中执行此操作。当我需要派生数据然后对这些派生执行其他功能时,我一直在努力。 CTE 是一种方式。我在有限的程度上使用了 temp tables,但并不精通它们的用法。这是查询。
USE SampleDW
WITH gifts AS
(
SELECT ClientBriefName,AccountIDKey,AdventID,AccountName,AccountType,FlipProvision,FlipDate,ExpectedFlipDate,GiftCategory,GiftType,
GiftDate,GiftAmount,AssetClass,SecurityType,UserDefinedCode,
COALESCE(
CASE WHEN MONTH(giftdate)IN(1,2,3) THEN 'Q1' ELSE NULL END,
CASE WHEN MONTH(giftdate)IN(4,5,6) THEN 'Q2' ELSE NULL END,
CASE WHEN MONTH(giftdate)IN(7,8,9) THEN 'Q3' ELSE NULL END,
CASE WHEN MONTH(giftdate)IN(10,11,12) THEN 'Q4' ELSE NULL END
) AS Quarter,
CASE WHEN AccountType IN('CORP','ENDOW','OTHER','990','DCA','PRIV-TAX') THEN 'NO' ELSE 'YES' END AS ISPG,
YEAR(Giftdate) YEAR,
CASE WHEN AccountType IN('CRUT','CGA','CRUTNI','CRAT','PIF','NQI','CRUTMU','LEAD-PCT','LEAD-FIXED','GRANTOR-OWNER','PRE-69')
THEN 'YES' ELSE 'NO' END AS LIFEINCOME
FROM Generic.dbo.PO_GiftDetails
)
SELECT ClientBriefName,AccountIDKey,AdventID,AccountName,AccountType,FlipProvision,FlipDate,ExpectedFlipDate,GiftCategory,GiftType,
GiftDate,GiftAmount,AssetClass,SecurityType,UserDefinedCode, ISPG, QUARTER,YEAR,gifts.LIFEINCOME, CAST(Quarter AS VARCHAR)+CAST(YEAR AS varchar) AS Period
FROM gifts
结果集
ClientBriefName AccountIDKey AdventID AccountName AccountType FlipProvision FlipDate ExpectedFlipDate GiftCategory GiftType GiftDate GiftAmount AssetClass SecurityType UserDefinedCode ISPG QUARTER YEAR LIFEINCOME Period
Client1 103859 Jsmith John Smith CRUT 0 NULL NULL Standard Unitrusts New Trusts 00:00.0 82300 e lcus 1 YES Q4 2012 YES Q42012
Client1 100281 Jsmith John Smith CRAT 0 NULL NULL Additions to Trusts Additions to Trusts 00:00.0 5000 c caus 2 YES Q4 2012 YES Q42012
Client2 100281 JaSmith Jane Smith CRUT 0 NULL NULL Additions to Trusts Additions to Trusts 00:00.0 5000 c caus 2 YES Q4 2012 YES Q42012
Client2 100281 JaSmith Jane Smith CRAT 0 NULL NULL Additions to Trusts Additions to Trusts 00:00.0 2000 c caus 2 YES Q4 2012 YES Q42012
Client1 103859 Jsmith John Smith CRUT 0 NULL NULL Standard Unitrusts New Trusts 00:00.0 82300 e lcus 1 YES Q1 2012 YES Q12012
Client1 100281 Jsmith John Smith CRAT 0 NULL NULL Additions to Trusts Additions to Trusts 00:00.0 5000 c caus 2 YES Q1 2012 YES Q12012
Client2 100281 JaSmith Jane Smith CRUT 0 NULL NULL Additions to Trusts Additions to Trusts 00:00.0 5000 c caus 2 YES Q1 2012 YES Q12012
Client2 100281 JaSmith Jane Smith CRAT 0 NULL NULL Additions to Trusts Additions to Trusts 00:00.0 2000 c caus 2 YES Q1 2012 YES Q12012
如果我想实现类似 table 的枢轴输出怎么办?我之前在 sQL 中使用过 pivot,但我不确定我将如何以最简单的形式在此查询中使用。所需的输出将按客户对各种礼物类型求和进行分组,所有总和最后按期间
分组AdventID Annuity Trusts Flip Trust Gift Annuity Pools Net Income Unitrusts Grand Total Period
CLIENT1 0 0 1187880.16 800 1188680.16 Q12012
CLIENT2 0 0 25014.6 500 25514.6 Q12012
CLIENT1 0 0 550123 800 550923 Q42012
CLIENT2 0 0 4851061 600 4851661 Q42012
继续进行聚合,因为您可以在派生的 table 或 CTE 上应用聚合。
下面我假设 GiftType
被分解为您的 post 中显示的所需结果的指定列。
WITH gifts AS
(
SELECT ClientBriefName, AccountIDKey, AdventID, AccountName, AccountType,
FlipProvision, FlipDate, ExpectedFlipDate, GiftCategory, GiftType,
GiftDate, GiftAmount, AssetClass, SecurityType, UserDefinedCode,
(CASE WHEN MONTH(GiftDate) IN (1, 2 ,3) THEN 'Q1' ELSE NULL END,
CASE WHEN MONTH(GiftDate) IN (4, 5, 6) THEN 'Q2' ELSE NULL END,
CASE WHEN MONTH(GiftDate) IN (7, 8, 9) THEN 'Q3' ELSE NULL END,
CASE WHEN MONTH(GiftDate) IN (10, 11, 12) THEN 'Q4' ELSE NULL END) AS Quarter,
CASE WHEN AccountType IN ('CORP','ENDOW','OTHER','990','DCA','PRIV-TAX')
THEN 'NO'
ELSE 'YES' END AS ISPG,
YEAR(Giftdate) AS [YEAR],
CASE WHEN AccountType IN ('CRUT','CGA','CRUTNI','CRAT','PIF','NQI','CRUTMU',
'LEAD-PCT', 'LEAD-FIXED','GRANTOR-OWNER','PRE-69')
THEN 'YES'
ELSE 'NO' END AS LIFEINCOME
FROM GenericDW.dbo.PO_GiftDetails
)
/* ADJUST AGGREGATES AS NEEDED */
SELECT AdventID, Sum(CASE WHEN GiftType = 'Annuity' THEN GiftAmount ELSE 0 END) As Annuity,
Sum(CASE WHEN GiftType = 'Trusts' THEN GiftAmount ELSE 0 END) As Trusts,
Sum(CASE WHEN GiftType = 'Flip Trust' THEN GiftAmount ELSE 0 END) As [Flip Trust],
Sum(CASE WHEN GiftType = 'Gift' THEN GiftAmount ELSE 0 END) As Gift,
Sum(CASE WHEN GiftType = 'Annuity Pools'
THEN GiftAmount ELSE 0 END) As [Annuity Pools],
Sum(CASE WHEN GiftType IN ('Annuity', 'Trusts', 'Flip Trust', 'Gift', 'Annuity Pools')
THEN GiftAmount ELSE 0) As [Net Income],
Sum(CASE WHEN GiftType = 'Unitrusts' THEN GiftAmount ELSE 0 END) As Unitrusts,
Sum(GiftAmount) As [Grand Total],
CAST([Quarter] + '-' + [Year] AS VARCHAR(100)) As [Period]
FROM gifts
GROUP BY AdventID, CAST([Quarter] + '-' + [Year] AS VARCHAR(100))
以及一个可能的关键解决方案
With gifts As ( ... )
SELECT AdventID, Sum([Annuity]), Sum([Trusts]), Sum([Flip Trust]),
Sum([Gift]), Sum([Annuity Pools]), Sum([Unitrusts]),
Sum([Annuity]) + Sum([Trusts]) + Sum([Flip Trust])
+ Sum([Gift]) + Sum([Annuity Pools]) As [Net Income],
Sum([GiftAmount]) As [Grand Total],
CAST([Quarter] + '-' + [Year] AS VARCHAR(100)) As [Period]
FROM gifts
PIVOT (
Sum([GiftAmount])
For [GiftType] In
([Annuity], [Trusts], [Flip Trust], [Gift], [Annuity Pools], [Unitrusts])
) AS pivotTable
GROUP BY AdventID, CAST([Quarter] + '-' + [Year] AS VARCHAR(100))