He leído las cosas en las tablas dinámicas de MS y todavía tengo problemas para hacer esto correctamente.
Tengo una tabla temporal que se está creando, diremos que la columna 1 es un número de Tienda, y la columna 2 es un número de semana y, por último, la columna 3 es un total de algún tipo. Además, los números de la semana son dinámicos, los números de la tienda son estáticos.
Store Week xCount
------- ---- ------
102 1 96
101 1 138
105 1 37
109 1 59
101 2 282
102 2 212
105 2 78
109 2 97
105 3 60
102 3 123
101 3 220
109 3 87
Me gustaría que salga como una tabla dinámica, así:
Store 1 2 3 4 5 6....
-----
101 138 282 220
102 96 212 123
105 37
109
Almacene números al costado y semanas en la parte superior.
sql
sql-server
pivot
pivot-table
Lynn
fuente
fuente
Respuestas:
Si está utilizando SQL Server 2005+, puede usar la
PIVOT
función para transformar los datos de filas en columnas.Parece que necesitará usar sql dinámico si las semanas son desconocidas, pero es más fácil ver el código correcto usando una versión codificada inicialmente.
Primero, aquí hay algunas definiciones de tablas rápidas y datos para su uso:
Si conoce sus valores, codificará la consulta:
Ver demostración de SQL
Entonces, si necesita generar el número de semana dinámicamente, su código será:
Ver demostración de SQL .
La versión dinámica, genera la lista de
week
números que deben convertirse en columnas. Ambos dan el mismo resultado:fuente
cte3 AS (select ... )
entonces tiene la lógica definida anteriormente con@cols
y@query
... hay un error. Nombre de objeto inválido 'cte3'. ¿Cómo lo soluciona? -STUFF(...)
antes (oXML PATH
tampoco). Para el beneficio de otros lectores, todo lo que está haciendo es unir los nombres de las columnas y cortar la coma principal. Tenga en cuenta que creo que lo siguiente es un poco más simple: seleccione @cols = (SELECCIONE EL COTIZO DISTINTO (Semana) + ',' del orden de yt por 1 PARA RUTA XML ('')) set @cols = SUBSTRING (@cols, 1, LEN ( @cols) - 1) ... reemplazandogroup by
bydistinct
yorder by 1
cortando manualmente una coma con sufijo !Esto es por un número dinámico de semanas.
Ejemplo completo aquí: SQL Dynamic Pivot
fuente
He logrado lo mismo antes usando subconsultas. Entonces, si su tabla original se llamaba StoreCountsByWeek y tuviera una tabla separada que enumerara los ID de las tiendas, entonces se vería así:
Una ventaja de este método es que la sintaxis es más clara y hace que sea más fácil unirse a otras tablas para incluir otros campos en los resultados también.
Mis resultados anecdóticos son que ejecutar esta consulta en un par de miles de filas completadas en menos de un segundo, y en realidad tuve 7 subconsultas. Pero como se señaló en los comentarios, es más costoso desde el punto de vista informático hacerlo de esta manera, así que tenga cuidado al usar este método si espera que se ejecute en grandes cantidades de datos.
fuente
Esto es lo que puedes hacer:
MANIFESTACIÓN
fuente
Estoy escribiendo un sp que podría ser útil para este propósito, básicamente este sp pivotea cualquier tabla y devuelve una nueva tabla pivoteada o devuelve solo el conjunto de datos, esta es la forma de ejecutarla:
tenga en cuenta que en el parámetro @agg los nombres de columna deben estar con
'['
y el parámetro debe terminar con una coma','
SP
Este es un ejemplo de ejecución:
luego
Select * From ##TEMPORAL1PVT
volvería:fuente
fuente
Aquí hay una revisión de la respuesta @Tayrn anterior que podría ayudarlo a comprender cómo pivotar un poco más fácilmente:
Puede que esta no sea la mejor manera de hacerlo, pero esto es lo que me ayudó a entender cómo pivotar las tablas.
ID = filas que desea pivotar
MY_KEY = la columna que está seleccionando de su tabla original que contiene los nombres de columna que desea pivotar.
VAL = el valor que desea devolver debajo de cada columna.
MAX (VAL) => Se puede reemplazar con otras funciones de agregación. SUMA (VAL), MIN (VAL), ETC ...
fuente
Solo darte una idea de cómo otras bases de datos resuelven este problema.
DolphinDB
también tiene soporte incorporado para pivotar y el sql se ve mucho más intuitivo y ordenado. Es tan simple como especificar la columna clave (Store
), la columna pivotante (Week
) y la métrica calculada (sum(xCount)
).DolphinDB es una base de datos columnar de alto rendimiento. El cálculo en la demostración cuesta tan solo 546 ms en una computadora portátil dell xps (i7 cpu). Para obtener más detalles, consulte el manual en línea de DolphinDB https://www.dolphindb.com/help/index.html?pivotby.html
fuente