Dib*_*tar 6 sql t-sql sql-server pivot sql-server-2005
我不确定如何最好地解决这个问题 - 我认为应该使用pivot/unpivot,但不确定如何使其工作(因为旋转列是非数字的)
我有下表(基于我无法修改的查询):
CREATE TABLE #data
(donor_id NVARCHAR(50)
,last_gift DATETIME
,[2005] NVARCHAR(50)
,numgifts05 INT
,value_05 MONEY
,[2006] NVARCHAR(50)
,numgifts06 INT
,value_06 MONEY
,[2007] NVARCHAR(50)
,numgifts07 INT
,value_07 MONEY
,[2008] NVARCHAR(50)
,numgifts08 INT
,value_08 MONEY
,[2009] NVARCHAR(50)
,numgifts09 INT
,value_09 MONEY
,[2010] NVARCHAR(50)
,numgifts10 INT
,value_10 MONEY
)
INSERT INTO #data VALUES (001,'2000-03-23 00:00:00.000','lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00)
INSERT INTO #data VALUES (002,'2006-08-01 00:00:00.000','reactivated donor',1,25.00,'2yrs consecutive',2,47.20,'lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00)
INSERT INTO #data VALUES (003,'2010-02-12 00:00:00.000','non-donor',0,0.00,'non-donor',0,0.00,'non-donor',0,0.00,'non-donor',0,0.00,'new donor',2,112.50,'2yrs consecutive',1,116.08)
INSERT INTO #data VALUES (004,'2010-01-04 00:00:00.000','non-donor',0,0.00,'non-donor',0,0.00,'non-donor',0,0.00,'non-donor',0,0.00,'non-donor',0,0.00,'new donor',1,12.00)
INSERT INTO #data VALUES (005,'2009-12-09 00:00:00.000','non-donor',0,0.00,'non-donor',0,0.00,'non-donor',0,0.00,'non-donor',0,0.00,'new donor',1,18.00,'lapsed donor',0,0.00)
INSERT INTO #data VALUES (006,'2005-01-10 00:00:00.000','new donor',1,20.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00)
INSERT INTO #data VALUES (007,'2009-01-07 00:00:00.000','non-donor',0,0.00,'non-donor',0,0.00,'non-donor',0,0.00,'non-donor',0,0.00,'new donor',1,25.00,'lapsed donor',0,0.00)
INSERT INTO #data VALUES (008,'1997-11-05 00:00:00.000','lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00)
INSERT INTO #data VALUES (009,'1999-06-18 00:00:00.000','lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00,'lapsed donor',0,0.00)
INSERT INTO #data VALUES (010,'2010-03-09 00:00:00.000','3/4yrs consecutive',12,120.00,'3/4yrs consecutive',12,120.00,'5yrs+ consecutive',13,142.40,'5yrs+ consecutive',13,170.00,'5yrs+ consecutive',13,160.00,'5yrs+ consecutive',3,30.00)
Run Code Online (Sandbox Code Playgroud)
我需要生成的是一个看起来像这样的表:
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...
Run Code Online (Sandbox Code Playgroud)
然而,我遇到的问题是,如果某人在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
Run Code Online (Sandbox Code Playgroud)
返回
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
Run Code Online (Sandbox Code Playgroud)
澄清之后
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
373 次 |
| 最近记录: |