Servidor SQL:Ejemplos de datos de cadena PIVOTING
-
09-06-2019 - |
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?
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
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:
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;