2017-02-16 1 views
0

Я пытаюсь отображать свои годовые сводные данные в новом формате от оригинала. В текущем формате отображается номер клиента, год и общая сумма за каждый месяц этого месяца. Имена Example.Column являются клиентами, 0 в течение года и 1-12 месяцев дляОтображение ежегодных сводных данных в 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 

Что мне нужно сейчас, чтобы изменить формат, чтобы быть что-то вроде этого.

customer year1 total1 year2 total2  
VALLERO 2014 0.00 2015 0.00 

ответ

0

Предполагая, что месячные столбцы не являются нулевыми.

Попробуйте это:

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; 

Если они просто обернуть столбцы в 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

Если «Год #» на основе стоимости жизненного времени клиента или по отношению к опыт клиента. Если НЕ ОТНОСЯЩАЯСЯ удалить Partition By Customer

Простота расширения количества колонок или даже динамическая динамика.

Вы заметите нового клиента в 2017 году и его Год1 является 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 

Возвращает

enter image description here

+0

Спасибо! Это меня очень близко к тому, что мне нужно отображать. Один вопрос, хотя я пытался установить его так, чтобы только один год мог находиться в столбце, таком как «год1», будет удерживаться «2014», а «year2» будет содержать «2015», тогда, если у человека не было данных для этого в конкретном году у них будет «нуль» за этот год. – mfoehrer