2017-02-16 9 views
0

Ich versuche, meine jährlichen zusammenfassenden Daten in einem neuen Format aus dem Original anzuzeigen. Das aktuelle Format zeigt den Kunden #, das Jahr und den Gesamtbetrag für jeden Monat hier an. Example.Column Namen sind Kunde, 0 für das Jahr und 1-12 für die MonateJährliche Zusammenfassung anzeigen Daten in SQL

customer  0   1   2   3   4   5   6    7   8   9   10   11   12 
VALLERO  2014 634.150000 560.740000 254.670000 370.292500 99.225000 157.426666 358.650000 190.925000 767.515000 71.665000 587.305000 615.525000 
VALLERO  2015 634.150000 560.740000 254.670000 370.292500 99.225000 157.426666 358.650000 190.925000 767.515000 71.665000 587.305000 615.525000 

Was ich jetzt brauche, ist das Format zu ändern, so etwas zu sein.

customer year1 total1 year2 total2  
VALLERO 2014 0.00 2015 0.00 

Antwort

0

Angenommen, Monate Spalten sind nicht null.

Try this:

select 
    customer, 
    max(case when year = 2014 then year end) year1, 
    max(case when year = 2014 then total end) total1, 
    max(case when year = 2015 then year end) year2, 
    max(case when year = 2015 then total end) total2 
from (
    select 
     customer, 
     [0] year, 
     [1] + [2] + [3] + [4] + [5] + [6] + [7] + [8] + [9] + [10] + [11] + [12] total 
    from t 
) t 
group by customer; 

Wenn sie wickeln nur die Spalten in coalesce:

select 
    customer, 
    max(case when year = 2014 then year end) year1, 
    sum(case when year = 2014 then total end) total1, 
    max(case when year = 2015 then year end) year2, 
    sum(case when year = 2015 then total end) total2 
from (
    select 
     customer, 
     [0] year, 
     coalesce([1],0) + coalesce([2],0) + coalesce([3],0) + coalesce([4],0) 
     + coalesce([5],0) + coalesce([6],0) + coalesce([7],0) + coalesce([8],0) 
     + coalesce([9],0) + coalesce([10],0) + coalesce([11],0) + coalesce([12],0) total 
    from t 
) t 
group by customer; 
1

Wenn „Jahr #“ auf der das Lebenszeitwert des Kunden oder in Bezug auf die Basis Erfahrung des Kunden. Wenn NICHT Relative nur entfernen Partition By Customer

Einfach, die Anzahl der Spalten zu erweitern oder sogar dynamisch zu machen.

Sie werden einen neuen Kunden im Jahr 2017 feststellen und seine Year1 ist 2017

Declare @YourTable table (customer varchar(25),[0] int,[1] money,[2] money,[3] money,[4] money,[5] money,[6] money,[7] money,[8] money,[9] money,[10] money,[11] money,[12] money) 
Insert Into @YourTable values 
('VALLERO' ,2014 ,634.150000 ,560.740000 ,254.670000 ,370.292500 ,99.225000 ,157.426666 ,358.650000 ,190.925000 ,767.515000 ,71.665000 ,587.305000 ,615.525000), 
('VALLERO' ,2015 ,634.150000 ,560.740000 ,254.670000 ,370.292500 ,99.225000 ,157.426666 ,358.650000 ,190.925000 ,767.515000 ,71.665000 ,587.305000 ,615.525000), 
('NewCust' ,2017 ,500.000000 ,650.000000 ,null  ,null  ,null  ,null  ,null  ,null  ,null  ,null  ,null  ,null  ) 


Select Customer 
     ,Year1 = max(case when YearNr= 1 then [0] end) 
     ,Total1 = sum(case when YearNr= 1 then Value end) 
     ,Year2 = max(case when YearNr= 2 then [0] end) 
     ,Total2 = sum(case when YearNr= 2 then Value end) 
From (
     Select Customer 
       ,YearNr=Dense_Rank() over (Partition By Customer Order by [0]) 
       ,[0] 
       ,Value 
     From @YourTable A 
     UnPivot (Value for Item in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) u 
    ) A 
Group By Customer 

Returns

enter image description here

+0

Dank! Das bringt mich wirklich nah an das, was ich zeigen muss. Eine Frage, obwohl ich versucht habe, es so zu setzen, dass nur ein Jahr in einer Spalte wie "Jahr1" sein kann, wird nur "2014" und "Jahr2" würde dann "2015" halten, wenn eine Person keine Daten dafür hätte bestimmtes Jahr hätten sie für dieses Jahr einen "Nullpunkt". – mfoehrer

Verwandte Themen