sql查询(可能通过pivot/unpivot解决)
我不确定如何最好地实现这一点-我认为应该使用pivot/unpivot,但不确定如何使其工作(因为pivot列是非数字的) 我有下表(基于无法修改的查询): 我需要做的是一张这样的桌子: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
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