sql-server - pasar - pivot y unpivot sql server
SQL Server: ejemplos de datos de cadenas PIVOTing (6)
Intentando encontrar algunos ejemplos simples de SQL Server PIVOT. La mayoría de los ejemplos que he encontrado implican contar o sumar números. Solo quiero pivotar algunos datos de cadena. Por ejemplo, tengo una consulta que devuelve lo siguiente.
Action1 VIEW
Action1 EDIT
Action2 VIEW
Action3 VIEW
Action3 EDIT
Me gustaría utilizar PIVOT (si es posible) para que los resultados sean así:
Action1 VIEW EDIT
Action2 VIEW NULL
Action3 VIEW EDIT
¿Esto es posible con la funcionalidad PIVOT?
Bueno, para su muestra y cualquiera con un número limitado de columnas únicas, esto debería hacerlo.
select
distinct a,
(select distinct t2.b from t t2 where t1.a=t2.a and t2.b=''VIEW''),
(select distinct t2.b from t t2 where t1.a=t2.a and t2.b=''EDIT'')
from t t1
Configuración de la tabla:
CREATE TABLE dbo.tbl (
action VARCHAR(20) NOT NULL,
view_edit VARCHAR(20) NOT NULL
);
INSERT INTO dbo.tbl (action, view_edit)
VALUES (''Action1'', ''VIEW''),
(''Action1'', ''EDIT''),
(''Action2'', ''VIEW''),
(''Action3'', ''VIEW''),
(''Action3'', ''EDIT'');
Su tabla: SELECT action, view_edit FROM dbo.tbl
Consulta sin usar PIVOT:
SELECT Action,
[View] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = ''VIEW''),
[Edit] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = ''EDIT'')
FROM tbl t
GROUP BY Action
Consulta usando PIVOT:
SELECT [Action], [View], [Edit] FROM
(SELECT [Action], view_edit FROM tbl) AS t1
PIVOT (MAX(view_edit) FOR view_edit IN ([View], [Edit]) ) AS t2
Ambas consultas resultan:
De http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/ :
SELECT CUST, PRODUCT, QTY
FROM Product) up
PIVOT
( SUM(QTY) FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)) AS pvt) p
UNPIVOT
(QTY FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)
) AS Unpvt
GO
Recuerde que la función de agregado MAX funcionará tanto en texto como en números. Esta consulta solo requerirá que la tabla se escanee una vez.
SELECT Action,
MAX( CASE data WHEN ''View'' THEN data ELSE '''' END ) ViewCol,
MAX( CASE data WHEN ''Edit'' THEN data ELSE '''' END ) EditCol
FROM t
GROUP BY Action
Si desea utilizar específicamente la función PIVOT de SQL Server, esto debería funcionar, suponiendo que sus dos columnas originales se llamen act y cmd. (No es tan lindo de ver, sin embargo)
SELECT act AS ''Action'', [View] as ''View'', [Edit] as ''Edit''
FROM (
SELECT act, cmd FROM data
) AS src
PIVOT (
MAX(cmd) FOR cmd IN ([View], [Edit])
) AS pvt
With pivot_data as
(
select
action, -- grouping column
view_edit -- spreading column
from tbl
)
select action, [view], [edit]
from pivot_data
pivot ( max(view_edit) for view_edit in ([view], [edit]) ) as p;