2010-09-13 10 views
6

No estoy seguro de cuál es la mejor manera de abordar esto: creo que se debe usar un pivote/unpivot, pero no estoy seguro de cómo hacerlo funcionar (ya que la columna pivotante no es -numeric)sql query (potencialmente solucionable con pivote/unpivot?)

he la siguiente tabla (basado en una consulta que no se puede modificar):

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) 

Y lo que necesito para producir es una tabla que se parece a esto:

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... 

Sin embargo, el problema que tengo es que si alguien s un donante caducado en 2005, no están necesariamente en esa categoría para 2006-2010, por lo que una persona tiene el potencial de aparecer en una fila diferente para cada año?

sé que todas las opciones de la categoría son fijos, por lo que no es necesario para el giro dinámico o algo por el estilo, en el caso de que ayuda :)

El objetivo principal es ser capaz de ver un recuento de cada categoría para cada año de un vistazo (para poder comparar todos los años entre sí) - ¡cualquier ayuda apreciada masivamente!

+0

+1 Para DDL útil. –

Respuesta

5

¿Es esto lo que necesita?

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 

devoluciones

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 

siguiente aclaración

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 
+0

¡Fantástico! Como una pregunta hipotética (o real si realmente puede dedicar el tiempo para responderla), si quisiera agregar las columnas que detallan el número de regalos/valor de regalos por año para que el diseño sea 2005 | # regalos05 | value05 | 2006 | # gifts06 ¿es posible usar la combinación pivote/unpivoto o requeriría un método diferente? – Dibstar

+0

increíble (probé una unión de todo, pero sin renombrar numgifts05 para ser numgifts) - gracias de nuevo por su ayuda, funciona una delicia :) – Dibstar