【发布时间】:2015-08-23 20:14:30
【问题描述】:
我正在使用 SQL Server 2012。我已尽我所能进行此查询。如您所见,我使用 CTE 导出值,然后在 select 语句中使用导出的值。在这个例子中,当我连接 Quarter +Year = Period
时,这只会发生一次我可以在 SSRS 报告的数据集中使用此查询来实现我想要的分组,但我想知道如何在 SQL 中执行此操作。当我需要派生数据然后对这些派生执行其他功能时,我一直在苦苦挣扎。 CTE 是一种方式。我在有限程度上使用了临时表,但并不精通它们的用法。这是查询。
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
如果我想实现类似数据透视表的输出怎么办。我以前在 SQL 中使用过数据透视,但我不确定如何以最简单的形式在此查询中使用。所需的输出将按客户对各种礼物类型的总和进行分组,所有总和的总和最后按期间分组
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
【问题讨论】:
-
您对
COALESCE+CASE的Quarter声明看起来过分了。为什么不CASE WHEN MONTH(giftdate)IN(1,2,3) THEN 'Q1' WHEN MONTH(giftdate)IN(4,5,6) THEN 'Q2' WHEN MONTH(giftdate)IN(7,8,9) THEN 'Q3' WHEN MONTH(giftdate)IN(10,11,12) THEN 'Q4' ELSE NULL END AS Quarter,? -
我不需要合并,但我要了解的是,一旦您开始获取数据,如何可靠地暂存数据以进行进一步的推导和转换。过去我使用 select into 然后重新开始使用新表,但这很草率且耗时。
-
lad2025 你的公式不能可靠地将月份放在各自的季度中。
-
试试这个
[Quarter] = 'Q' + CAST(DATEPART(qq, giftdate) AS CHAR(1)) -
“过去我使用 select into 然后重新开始使用新表,但这很草率且耗时。” => 多步骤使用 CTE
标签: sql sql-server-2012 aggregate pivot-table common-table-expression