Как мне PIVOT набор столбцов на основе конкретного столбца? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть столбцы агрегированных данных, и я хочу PIVOT их в мой столбец 'TYPE'.

Мои данные выглядят так

ID          Country TYPE        Approved  Dispursed Payments  Amend  Deob
----------  ------- ----------  --------  --------- --------  -----  ----
40002-0086  US      Republic       79802  66163.05         0      0     0
40022-0002  Russia  Sultanate     456435         0      3000   9789   578
40002-0002  Nkorea  Dictatorship   50000     50000         0      0   789
40001-0001  Malta   Democracy     200000         0         0    456     0
40016-0013  UAE     Monarchy       65456    559542         0      0     0
40001-0002  Egypt   Federal       250000    250000         0      0    56
40002-0012  Canada  Parliamentary   7898      2000         0    789     0

И я пытаюсь сделать так, чтобы они выглядели какэто

ID  Country Republic Approved   Republic Disbursed  Republic Repaid Sultanate Approved  Sultanate Disbursed Federal Approved    Federal Disbursed   Monarchy Payments
44408   UAE  52,624,624.00  854,046.73   678,678.00      684,829.00      684,751.98      -       -       -   
41898   Canada   23,423,423.00   3,454,345.00    58,810.00   783,766.15      783,766.15      453,654,423.00      8,368,354.00    386,836.00 

Я пытаюсь использовать оператор PIVOT

Это то, что я пробовал до сих пор

SELECT 'ID' AS ID,   
[Republic Approved],[Republic Disbursed],[Republic Repaid],[Sultanate Approved],[Sultanate Disbursed],[Federal Approved],[Federal Disbursed],[Monarchy Payments]

FROM  
(SELECT ID, Country   
    FROM Table.ID) AS SourceTable  
PIVOT  
(  
[TYPE]  
FOR ID, Country IN ([Republic Approved],[Republic Disbursed],[Republic Repaid],[Sultanate Approved],[Sultanate Disbursed],[Federal Approved],[Federal Disbursed],[Monarchy Payments]
 )  
) AS PivotTable;  

Ответы [ 3 ]

4 голосов
/ 10 мая 2019

Чтобы объединить несколько способов, вам придется агрегировать каждый из них по отдельности.Обратите внимание, что в приведенном ниже коде, если условие «type» в операторе case не выполняется, возвращается значение null.Таким образом, агрегации (я использую здесь сумму) будут агрегировать только по этому типу.

select    id,
          country,
          [Republic Approved] = sum(case when type = 'republic' then approved end),
          [Republic Disbursed] = sum(case when type = 'republic' then disbursed end),
          ...,
          [Sultanate Approved] = sum(case when type = 'sultanate' then approved end),
          ...
from      sourceTable
group by  id, 
          country

Я делаю некоторые предположения о том, что вы действительно хотите здесь, хотя, поскольку ваши заявленные желаемые результаты подразумевают, что есть больше данныхв вашем наборе данных.

В качестве альтернативы, вы можете сначала отключить эти столбцы с типом платежа, объединить полученные имена с типом правительства, а затем развернуть объединенные имена.Но это будет менее производительным и, вероятно, менее читабельным, хотя, возможно, вам будет легче набрать меньше символов (никогда не самая мудрая цель).

1 голос
/ 10 мая 2019

Один из подходов - UNPIVOT данных через CROSS APPLY, а затем PIVOT

Предполагается, что вам не нужен ДИНАМИЧЕСКИЙ Пивот

Пример

Select *
 From  (  
        Select ID
              ,Country
              ,B.*
         From  YourTable
         Cross Apply ( values ([Type]+' Approved' ,[Approved])
                             ,([Type]+' Dispursed',[Dispursed])
                             ,([Type]+' Payments' ,[Payments])
                             ,([Type]+' Amend'    ,[Amend])
                             ,([Type]+' Deob'     ,[Deob])
                     ) B(Item,Value)
        ) src
 Pivot ( sum(value) for Item in ( [Republic Approved]
                                 ,[Republic Disbursed]
                                 ,[Republic Repaid]
                                 ,[Sultanate Approved]
                                 ,[Sultanate Disbursed]
                                 ,[Federal Approved]
                                 ,[Federal Disbursed]
                                 ,[Monarchy Payments]  
                                 ) ) pvt

Просто чтобы помочь с визуализацией

Данные src "кормление" ось будет выглядеть примерно так ...

enter image description here

0 голосов
/ 11 мая 2019

Не фанат этого решения, но оно даст вам то, что вам нужно

WITH CTE AS 
  (SELECT ID,Country,Type+'-'+Status AS Type, Quantity 
   FROM Table
   UNPIVOT
    (
    Quantity FOR Status IN ([Approved],[Dispursed],[Payments],[Amend],[Deob])
    ) as up
) 
SELECT ID,Country,[Republic-Approved],[Republic-Dispursed],[Republic-Payments],[Republic-Amend],[Republic-Deob],
                               [Sultanate-Approved],[Sultanate-Dispursed],[Sultanate-Payments],[Sultanate-Amend],[Sultanate-Deob]
FROM CTE
PIVOT ( 
    SUM(Quantity) FOR Type IN ([Republic-Approved],[Republic-Dispursed],[Republic-Payments],[Republic-Amend],[Republic-Deob],
                               [Sultanate-Approved],[Sultanate-Dispursed],[Sultanate-Payments],[Sultanate-Amend],[Sultanate-Deob])
   )p
...