Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 双柱旋转_Sql_Sql Server 2005 - Fatal编程技术网

Sql 双柱旋转

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

嗨, 使用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(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