Se me ha encomendado la tarea de encontrar un medio para traducir los siguientes datos:
date category amount
1/1/2012 ABC 1000.00
2/1/2012 DEF 500.00
2/1/2012 GHI 800.00
2/10/2012 DEF 700.00
3/1/2012 ABC 1100.00
en lo siguiente:
date ABC DEF GHI
1/1/2012 1000.00
2/1/2012 500.00
2/1/2012 800.00
2/10/2012 700.00
3/1/2012 1100.00
Los espacios en blanco pueden ser NULL o espacios en blanco, o bien está bien, y las categorías deberían ser dinámicas. Otra posible advertencia a esto es que ejecutaremos la consulta en una capacidad limitada, lo que significa que las tablas temporales están fuera. He intentado investigar y he llegado a tierra, PIVOT
pero como nunca lo he usado antes, realmente no lo entiendo, a pesar de mis mejores esfuerzos para resolverlo. ¿Alguien puede señalarme en la dirección correcta?
sql
sql-server
tsql
pivot
Sean Cunningham
fuente
fuente
Respuestas:
SQL PIVOT dinámico:
Resultados:
fuente
@cols
entonces se podría eliminar elDISTINCT
usoGROUP BY
yORDER BY
cuando llegue a la lista de@cols
.PIVOTE SQL dinámico
Enfoque diferente para crear cadenas de columnas
Resultado
fuente
Sé que esta pregunta es más antigua, pero estaba buscando las respuestas y pensé que podría ampliar la parte "dinámica" del problema y posiblemente ayudar a alguien.
En primer lugar, construí esta solución para resolver un problema que un par de compañeros de trabajo estaban teniendo con conjuntos de datos grandes e inconstantes que debían pivotar rápidamente.
Esta solución requiere la creación de un procedimiento almacenado, por lo que si eso no se ajusta a sus necesidades, deje de leer ahora.
Este procedimiento tomará las variables clave de una declaración dinámica para crear dinámicamente declaraciones dinámicas para diferentes tablas, nombres de columnas y agregados. La columna estática se usa como la columna de grupo por / identidad para el pivote (esto puede eliminarse del código si no es necesario, pero es bastante común en las declaraciones de pivote y fue necesario para resolver el problema original), la columna pivote es donde se generarán los nombres de columna resultantes finales, y la columna de valor es a lo que se aplicará el agregado. El parámetro Table es el nombre de la tabla, incluido el esquema (schema.tablename), esta parte del código podría usar algo de amor porque no es tan limpio como me gustaría que fuera. Funcionó para mí porque mi uso no era público y la inyección de sql no era una preocupación.
Comencemos con el código para crear el procedimiento almacenado. Este código debería funcionar en todas las versiones de SSMS 2005 y superiores, pero no lo he probado en 2005 o 2016, pero no puedo ver por qué no funcionaría.
A continuación, prepararemos nuestros datos para el ejemplo. Tomé el ejemplo de datos de la respuesta aceptada con la adición de un par de elementos de datos para usar en esta prueba de concepto para mostrar los resultados variados del cambio agregado.
Los siguientes ejemplos muestran las declaraciones de ejecución variadas que muestran los agregados variados como un ejemplo simple. No opté por cambiar las columnas estáticas, dinámicas y de valor para mantener el ejemplo simple. Debería poder simplemente copiar y pegar el código para comenzar a jugarlo usted mismo
Esta ejecución devuelve los siguientes conjuntos de datos respectivamente.
fuente
Versión actualizada para SQL Server 2017 usando la función STRING_AGG para construir la lista de columnas dinámicas:
fuente
Puede lograr esto usando TSQL dinámico (recuerde usar QUOTENAME para evitar ataques de inyección SQL):
Pivotes con columnas dinámicas en SQL Server 2005
SQL Server - Tabla dinámica PIVOT - Inyección SQL
Referencia obligatoria a The Curse and Blessings of Dynamic SQL
fuente
QUOTENAME
solo ayuda a los ataques de inyección SQL si acepta @tableName como parámetro de un usuario y lo agrega a una consulta comoSET @sql = 'SELECT * FROM ' + @tableName;
. Puede crear muchas cadenas SQL dinámicas vulnerables yQUOTENAME
no hará un esfuerzo para ayudarlo.Ahí está mi solución limpiando los valores nulos innecesarios
fuente
El siguiente código proporciona los resultados que reemplazan NULL a cero en la salida.
Creación de tablas e inserción de datos:
Consulta para generar los resultados exactos que también reemplazan NULL con ceros:
SALIDA
fuente