Pivot для создания вывода в виде матрицы без агрегатной функции - PullRequest
2 голосов
/ 23 мая 2019

У меня три таблицы.

PeriodTable (всегда последние 4 года)

**ID   Year**  
1     2016      
2     2017  
3     2018  
4     2019

StatusTable (всегда четыре состояния)

**ID   Status**  
1     Completed      
2     Open  
3     New  
4     Declained

TransactionTable

**Year  AccountName  TotalAmount    Status**    
2019    King         1000000.00     Declained   
2019    BlueBird     3800000.00     Completed      
2018    Heartly Inc  250000.00      Open        
2016    ABB Data     1500000.00     Completed       
2016    Delta        500000.00      Declained

Ожидаемый результат: Всего № статуса из TransactionTable * 4 года. В этом случае 20 строк.

**Year  AccountName  TotalAmount    Status**    
2019    King         1000000.00     Declained   
2019    BlueBird     3800000.00     Completed
2019    NULL            NULL        Open        
2019    NULL            NULL        Completed       
2019    NULL            NULL        Declained      
2018    NULL            NULL        Declained   
2018    NULL            NULL        Completed      
2018    Heartly Inc  250000.00      Open        
2018    NULL            NULL        Completed       
2018    NULL            NULL        Declained
2017    NULL            NULL        Declained   
2017    NULL            NULL        Completed      
2017    NULL            NULL        Open        
2017    NULL            NULL        Completed       
2017    NULL            NULL        Declained
2016    NULL            NULL        Declained   
2016    NULL            NULL        Completed      
2016    NULL            NULL        Open        
2016    ABB Data     1500000.00     Completed       
2016    Delta        500000.00      Declained

Я пробовал многие решения от Google, но у меня ничего не получилось. Можно ли добиться с помощью функции pivot, так как мне здесь не нужна опция агрегирования.

1 Ответ

2 голосов
/ 23 мая 2019

Попробуйте что-нибудь подобное:

select 
    p.Year, 
    case when p.Year <> t.Year then null else t.AccountName end as AccountName, 
    case when p.Year <> t.Year then null else t.TotalAmount end as TotalAmount, 
    t.Status
from #period as p
cross join #trans as t
order by p.Year desc

Вы можете проверить это на SQL Fiddle

...