Sql 双柱旋转
嗨, 使用SQL server 2005,我有以下查询:Sql 双柱旋转,sql,sql-server-2005,Sql,Sql Server 2005,嗨, 使用SQL server 2005,我有以下查询: SELECT contact_id ,YEAR(date_created) AS giftyear ,SUM(amount_exc_vat) AS year_total_xGA ,SUM(amount_inc_vat) AS year_total_inGA ,COUNT(*) AS numGifts FROM gifts GROUP BY contact_id ,Year(d
SELECT
contact_id
,YEAR(date_created) AS giftyear
,SUM(amount_exc_vat) AS year_total_xGA
,SUM(amount_inc_vat) AS year_total_inGA
,COUNT(*) AS numGifts
FROM gifts
GROUP BY contact_id
,Year(date_created)
它返回的数据如下所示:
contact_id | giftyear | year_total_xVAT |year_total_inVAT | numGifts
id001 | 2006 | 17.00 | 21.79 | 4
id001 | 2007 | 5.00 | 6.41 | 1
id001 | 2008 | 5.00 | 6.41 | 1
然后,我希望透视这些数据,使表看起来像这样
contact_id | gift_2006 | 2006_excVAT | 2006_incVAT | 2007gifts | 2007_excVAT | 2007_incVAT | gift_2008 | 2008_excvat | 2008_incvat
id001 | 1 | 17.00 | 21.79 | 1 | 5.00 | 6.41 | 1 | 5.00 | 6.41
因此,如果gift_2006 etc本质上是一个案例陈述,说明如果联系人id在2006年赠送了礼物,那么将1分配给其他0-因此对于一个联系人,所有信息都包含在一行中
提前感谢:)当我尝试此操作时,我得到一个错误,即创建的日期未包含在聚合中,并且当我将其添加到其中时,会为每个联系人id生成重复的行。此外,我从一些人那里听说案例陈述是最有效的,拥有所有这些嵌套的CASE语句会大大降低速度吗谢谢,@Davin-嗯,这是基本的想法。由于您在帖子中没有提供任何DDL(CREATETABLE语句),因此我没有在这一方面对其进行测试。如果你编辑你的问题,包括为礼物创建表脚本,我会这样做。这是唯一合理的做法。对于这种方法,
Pivot
操作符基本上是语法上的糖。顺便说一句,我只是在这方面进行了测试,没有得到任何这样的错误。你确定你没有改变什么吗?我唯一改变的是在2009/2010年增加了两个额外的案例陈述,但除此之外,它与你在上面输入的内容完全相同?@Davin-你能尝试一下我的答案,并确认它是有效的吗。
SELECT
contact_id,
CASE WHEN COUNT(CASE WHEN YEAR(date_created) = 2006 THEN 1 END) > 0 THEN 1 ELSE 0 END AS gift_2006,
SUM(CASE WHEN YEAR(date_created) = 2006 THEN amount_exc_vat END) AS [2006_excVAT] ,
SUM(CASE WHEN YEAR(date_created) = 2006 THEN amount_inc_vat END) AS [2006_incVAT] ,
CASE WHEN COUNT(CASE WHEN YEAR(date_created) = 2007 THEN 1 END) > 0 THEN 1 ELSE 0 END AS gift_2007,
SUM(CASE WHEN YEAR(date_created) = 2007 THEN amount_exc_vat END) AS [2007_excVAT] ,
SUM(CASE WHEN YEAR(date_created) = 2007 THEN amount_inc_vat END) AS [2007_incVAT] ,
CASE WHEN COUNT(CASE WHEN YEAR(date_created) = 2008 THEN 1 END) > 0 THEN 1 ELSE 0 END AS gift_2008,
SUM(CASE WHEN YEAR(date_created) = 2008 THEN amount_exc_vat END) AS [2008_excVAT] ,
SUM(CASE WHEN YEAR(date_created) = 2008 THEN amount_inc_vat END) AS [2008_incVAT]
FROM gifts
GROUP BY contact_id