sql查询(可能通过pivot/unpivot解决)

sql查询(可能通过pivot/unpivot解决),sql,sql-server,sql-server-2005,tsql,pivot,Sql,Sql Server,Sql Server 2005,Tsql,Pivot,我不确定如何最好地实现这一点-我认为应该使用pivot/unpivot,但不确定如何使其工作(因为pivot列是非数字的) 我有下表(基于无法修改的查询): 我需要做的是一张这样的桌子: Category | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 Lapsed donor | count(lapsed for 2005) | New donor | count(new donor for

我不确定如何最好地实现这一点-我认为应该使用pivot/unpivot,但不确定如何使其工作(因为pivot列是非数字的)

我有下表(基于无法修改的查询):

我需要做的是一张这样的桌子:

Category          |  2005   |  2006  |  2007  | 2008  |  2009  |  2010

Lapsed donor      | count(lapsed for 2005) |
New donor         | count(new donor for 2005) |
2yrs consecutive  | count(2yrs consecutive for 2005) |
etc...
然而,我的问题是,如果有人在2005年是过期的捐赠者,他们在2006-2010年不一定属于这一类别,那么每年有一个人可能出现在不同的一行

我知道所有类别选项都是固定的,因此不需要动态旋转或类似的操作,以防有所帮助:)

主要目标是能够一眼就看到每年每个类别的数量(因此我可以将所有年份相互比较)-非常感谢任何帮助

这就是你需要的吗

SELECT Category,[2005],[2006],[2007],[2008],[2009],[2010]  
FROM 
(SELECT [2005],[2006],[2007],[2008],[2009],[2010],donor_id FROM #DATA) P
UNPIVOT  (Category FOR [YEAR] IN 
      ([2005],[2006],[2007],[2008],[2009],[2010])
)AS unpvt
PIVOT
(
COUNT (donor_id)
FOR [YEAR] IN
( [2005],[2006],[2007],[2008],[2009],[2010])
) AS pvt
ORDER BY Category
返回

Category                       2005        2006        2007        2008        2009        2010
------------------------------ ----------- ----------- ----------- ----------- ----------- -----------
2yrs consecutive               0           1           0           0           0           1
3/4yrs consecutive             1           1           0           0           0           0
5yrs+ consecutive              0           0           1           1           1           1
lapsed donor                   3           4           5           5           5           7
new donor                      1           0           0           0           3           1
non-donor                      4           4           4           4           1           0
reactivated donor              1           0           0           0           0           0
澄清后

With base AS
(
SELECT 2005 as [Year], [2005] as Category, numgifts05 as numgifts,  value_05  as value
from #data
union all
SELECT  2006 as [Year], [2006] as Category, numgifts06 as numgifts,  value_06  as value
from #data
)
select 
    Category
    ,COUNT(case when [Year]=2005 then 1 end) as [2005]
    ,SUM(case when [Year]=2005 then numgifts end) as [numgifts05]
    ,SUM(case when [Year]=2005 then value end) as [value_05]
    ,COUNT(case when [Year]=2006 then 1 end) as [2006]
    ,SUM(case when [Year]=2006 then numgifts end) as [numgifts06]
    ,SUM(case when [Year]=2006 then value end) as [value_06]
from base
group by Category
order by Category

好极了作为一个假设性的问题(或者是一个真实的问题,如果你能抽出时间来回答的话),如果我想在列中添加礼物数量/每年礼物价值的详细信息,以便布局为2005 |#gifts05 | value05 | 2006 |#gifts06这是否可能使用pivot/unpivot组合,或者这需要不同的方法?太棒了(尝试了一个联合,但没有将numgifts05重命名为numgifts)-再次感谢您的帮助,非常感谢:)
With base AS
(
SELECT 2005 as [Year], [2005] as Category, numgifts05 as numgifts,  value_05  as value
from #data
union all
SELECT  2006 as [Year], [2006] as Category, numgifts06 as numgifts,  value_06  as value
from #data
)
select 
    Category
    ,COUNT(case when [Year]=2005 then 1 end) as [2005]
    ,SUM(case when [Year]=2005 then numgifts end) as [numgifts05]
    ,SUM(case when [Year]=2005 then value end) as [value_05]
    ,COUNT(case when [Year]=2006 then 1 end) as [2006]
    ,SUM(case when [Year]=2006 then numgifts end) as [numgifts06]
    ,SUM(case when [Year]=2006 then value end) as [value_06]
from base
group by Category
order by Category