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;
3 respuestas
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).
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í ...
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
Nuevas preguntas
sql-server
Microsoft SQL Server es un sistema de gestión de bases de datos relacionales (RDBMS). Use esta etiqueta para todas las ediciones de SQL Server, incluidas Compact, Express, Azure, Fast-track, APS (anteriormente PDW) y Azure SQL DW. No use esta etiqueta para otros tipos de DBMS (MySQL, PostgreSQL, Oracle, etc.). No utilice esta etiqueta para problemas de software y desarrollo móvil, a menos que esté directamente relacionada con la base de datos.