Tengo columnas de datos agregados y quiero PIVOTARlas a mi columna 'TIPO'.

Mis datos se ven así

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

Y estoy tratando de que se vea así

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 

Estoy tratando de usar la operadora PIVOT

Esto es lo que he intentado hasta ahora

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;  
-1
Chris 10 may. 2019 a las 22:24

3 respuestas

La mejor respuesta

Para pivotar múltiples formas, tendrá que agregar cada una individualmente. Tenga en cuenta que en el siguiente código, si no se cumple la condición de 'tipo' en la declaración de caso, se devuelve nulo. Entonces, las agregaciones (estoy usando la suma aquí) solo se agregarán sobre ese tipo.

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

Sin embargo, estoy haciendo algunas suposiciones sobre lo que realmente quiere, ya que los resultados deseados indicados implican que hay más datos en su conjunto de datos.

Alternativamente, primero podría desconectarse de esas columnas de tipo de pago, concatenar los nombres resultantes con el tipo de gobierno y luego pivotar sobre los nombres concatenados. Pero esto será menos eficiente y probablemente menos legible, aunque posiblemente te salgas con menos caracteres escritos (nunca el objetivo más sabio).

5
pwilcox 10 may. 2019 a las 20:54

Un enfoque es UNPIVOT los datos a través de un CROSS APPLY y luego PIVOT

Esto supone que no necesita un pivote DINÁMICO

Ejemplo

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

Solo para ayudar con la visualización

Los src datos "alimentación" del pivote se verían así ...

enter image description here

1
John Cappelletti 10 may. 2019 a las 21:13

No soy fanático de esta solución, pero le dará lo que necesita.

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
0
Uasthana 10 may. 2019 a las 21:02