Reputation: 35
I am trying to display my yearly summary data in a new format from the original. The current format shows the customer#, year, and total amount for each month of that here. Example.Column names are customer, 0 for the year and 1-12 for the months
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
What I need now is to change the format to be something like this.
customer year1 total1 year2 total2
VALLERO 2014 0.00 2015 0.00
Upvotes: 0
Views: 64
Reputation: 82020
If "Year #" is based on the the customer's life-time value or relative to the customer's experience. If NOT Relative just remove Partition By Customer
Easy to expand the number of columns or even make dynamic.
You'll notice a New Customer in 2017 and his Year1 is 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
Upvotes: 1
Reputation: 39537
Assuming months columns are not 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;
If they are just wrap the columns into 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;
Upvotes: 0