Pregunta

Intentando encontrar algunos ejemplos simples de PIVOT de SQL Server.La mayoría de los ejemplos que he encontrado implican contar o sumar números.Sólo quiero girar 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 usar PIVOT (si es posible) para que los resultados sean así:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

¿Es esto posible incluso con la funcionalidad PIVOT?

¿Fue útil?

Solución

Recuerde que la función agregada MAX funcionará tanto con texto como con 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

Otros consejos

Si desea utilizar específicamente la función PIVOT de SQL Server, entonces esto debería funcionar, suponiendo que sus dos columnas originales se llamen act y cmd.(Aunque no es tan bonito a la vista).

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

Configuración de la mesa:

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');

Tu mesa:SELECT action, view_edit FROM dbo.tbl

Your table

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 mediante 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:
enter image description here

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

Bueno, para su muestra y cualquiera con un número limitado de columnas únicas, esto debería ser suficiente.

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
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;

Tuve una situación en la que estaba analizando cadenas y las dos primeras posiciones de la cadena en cuestión serían los nombres de campo de un estándar de codificación de reclamaciones de atención médica.Entonces quitaría las cadenas y obtendría valores para F4, UR y UQ o cualquier otra cosa.Esto fue genial en un registro o en algunos registros para un usuario.Pero cuando quería ver cientos de registros y los valores de todos los usuarios, necesitaba ser un PIVOT.Esto fue maravilloso, especialmente para exportar muchos registros para sobresalir.La solicitud de informe específica que recibí fue "cada vez que alguien presentó un reclamo por Benadryl, ¿qué valor presentó en los campos F4, UR y UQ?Tuve una APLICACIÓN EXTERNA que creó el ColTitle y los campos de valor a continuación

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )

Puedes usar esto con pivote:

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top