2010-09-13 6 views
6

मुझे यकीन नहीं है कि इस तक कैसे पहुंचा जा सकता है - मुझे लगता है कि एक पिवट/अनपोट का उपयोग किया जाना चाहिए, लेकिन यह सुनिश्चित नहीं करना है कि इसे कैसे काम करना है (क्योंकि पिवोटिंग कॉलम एक गैर है -numeric)एसक्यूएल क्वेरी (संभावित रूप से पिवट/अनपिवोट के साथ हल करने योग्य?)

मैं है तालिका में निम्नलिखित (एक प्रश्न मैं संशोधित नहीं कर सकते) के आधार पर:

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

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) 

और क्या मैं उत्पादन की जरूरत है एक मेज जो इस तरह दिखता है

हालांकि मेरी समस्या यह है कि अगर कोई मैं 2005 में एक लापता दाता है, वे 2006-2010 के लिए उस श्रेणी में जरूरी नहीं हैं, इसलिए एक व्यक्ति के पास प्रत्येक वर्ष एक अलग पंक्ति में शामिल होने की क्षमता है?

मुझे पता है कि श्रेणी सभी विकल्पों को निर्धारित किया जाता है, तो गतिशील पिवट या ऐसा कुछ के लिए कोई जरूरत नहीं है, के मामले में यह मदद करता है :)

मुख्य उद्देश्य की गिनती को देखने के लिए सक्षम होने के लिए है प्रत्येक वर्ष प्रत्येक श्रेणी के लिए एक नज़र में (इसलिए मैं एक दूसरे के खिलाफ सभी वर्षों की तुलना करता हूं) - किसी भी मदद की सराहना की !!

+0

+1 उपयोगी DDL निम्नलिखित। –

उत्तर

5

क्या आपको यह चाहिए?

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

शानदार! एक काल्पनिक प्रश्न के रूप में (या एक असली अगर आप वास्तव में इसका जवाब देने के लिए समय निकाल सकते हैं), अगर मैं प्रति वर्ष उपहारों के उपहार/मूल्य की संख्या का विवरण देने वाले कॉलम में जोड़ना चाहता था ताकि लेआउट 2005 होगा। # उपहार 0 | value05 | 2006 | # gift06 यह पिवोट/अनपिवोट संयोजन का उपयोग कर संभव है या इसके लिए एक अलग विधि की आवश्यकता होगी? – Dibstar

+0

अद्भुत (सभी संघों की कोशिश की, लेकिन numgifts05 को numgifts होने के नाम के बिना) - आपकी मदद के लिए फिर से धन्यवाद, एक इलाज काम करता है :) – Dibstar

संबंधित मुद्दे