requête sql (potentiellement solvable avec pivot / unpivot?)

Je ne suis pas sûr de la meilleure façon d'aborder cela – je pense qu'un pivot / unpivot devrait être utilisé, mais je ne sais pas comment le faire fonctionner (comme la colonne pivotante est un non-numérique)

J'ai le tableau suivant (basé sur une requête que je ne peux pas modifier):

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) 

Et ce que je dois produire est une table qui ressemble à ceci:

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

Cependant, le problème que j'ai, c'est que si quelqu'un est un donneur inutilisé en 2005, il n'est pas nécessairement dans cette catégorie pour 2006-2010, alors une personne peut apparaître dans une rangée différente chaque année.

Je sais que toutes les options de catégorie sont fixes, donc il n'y a pas besoin de pivotement dynamic ou quelque chose comme ça, au cas où ça aide 🙂

L'objective principal est de pouvoir voir en un coup d'œil le count de chaque catégorie pour chaque année (donc je peux comparer toutes les années les unes par rapport aux autres) – toute aide massivement appréciée !!

Est-ce ce dont vous avez besoin?

 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 

Résultats

 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 

Après la clarification

 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