SQL Server: ejemplos de datos de cadenas PIVOTANTES


124

Intentando encontrar algunos ejemplos simples de PIVOT de SQL Server. La mayoría de los ejemplos que he encontrado implican contar o resumir 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 usar PIVOT (si es posible) para hacer que los resultados sean así:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

¿Es esto posible con la funcionalidad PIVOT?



Eche un vistazo a este enlace: dotnetgalactics.wordpress.com/2009/10/23/… Podría ser útil;)
Pato

Puede ver este enlace si se desconoce el número de elementos distintos, lo que significa que ninguna de las columnas después de pivotar es dinámica. SQL Server Pivot: Convertir filas a columnas con consulta dinámica
maeenul

Respuestas:


164

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

+1 Amigo ... eres realmente un genio. ¡Ojalá hubiera sabido esto antes, en lugar de tener que aprender a PIVOTAR!
cenizas999

@ Silmaril89 asume que el nombre de la segunda columna en cuestión es 'datos' y la primera columna es 'Acción'
Iman

1
¿Hay alguna razón por la que no debería usar en ...ELSE NULL END...lugar de ...ELSE '' END...?
mes

15
¿Cuál es más rápido, esto o PIVOT?
Robert Jeppesen

Whoah, acabas de volar mi mente. En el fondo de mi cabeza tenía esta idea de lo que pensaba que el servidor SQL "debería hacer ¡maldita sea!", Pero pensé que no se podía hacer. Entonces, vi esto.
David Hay

54

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

Tu mesa

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:
ingrese la descripción de la imagen aquí


Gracias por esta respuesta rara y clara. muestra inmediatamente un ejemplo y los conjuntos de datos resultantes
real_yggdrasil

Sé que esto es viejo, pero esta es la demostración pivote más clara y mejor ilustrada que he visto.
Stan Shaw

52

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

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


6

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

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

0

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 reclamos de atención médica. Así que 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 para todos los usuarios, tenía que 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 presentaba un reclamo por Benadryl, qué valor enviaban en los campos F4, UR y UQ. Tenía una APLICACIÓN EXTERNA que creaba el ColTitle y los campos de valor a continuación

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.