w3schools pasar multiple filas ejemplos ejemplo columns columnas sql-server tsql pivot

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:



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;