Me gustaría una forma de resumir una tabla de base de datos para que las filas que comparten una ID común se resumen en una fila de salida.Producir una tabla de resumen ("pivote"?)
Mis herramientas son SQLite y Python 2.x.
Por ejemplo, dada la siguiente tabla de precios de las frutas en mis supermercados locales ...
+--------------------+--------------------+--------------------+
|Fruit |Shop |Price |
+--------------------+--------------------+--------------------+
|Apple |Coles |$1.50 |
|Apple |Woolworths |$1.60 |
|Apple |IGA |$1.70 |
|Banana |Coles |$0.50 |
|Banana |Woolworths |$0.60 |
|Banana |IGA |$0.70 |
|Cherry |Coles |$5.00 |
|Date |Coles |$2.00 |
|Date |Woolworths |$2.10 |
|Elderberry |IGA |$10.00 |
+--------------------+--------------------+--------------------+
... quiero producir una tabla resumen que me muestra el precio de cada fruta en cada supermercado. Los espacios en blanco deben llenarse con NULL.
+----------+----------+----------+----------+
|Fruit |Coles |Woolworths|IGA |
+----------+----------+----------+----------+
|Apple |$1.50 |$1.60 |$1.70 |
|Banana |$0.50 |$0.60 |$0.70 |
|Cherry |NULL |$5.00 |NULL |
|Date |$2.00 |$2.10 |NULL |
|Elderberry|NULL |NULL |$10.00 |
+----------+----------+----------+----------+
Creo que la literatura llama a esto una "tabla dinámica" o una "consulta de pivote", pero al parecer SQLite doesn't support PIVOT
. (La solución en esa pregunta usos codificados LEFT JOIN
s. Esto en realidad no me atrae porque Don 't saber los nombres de "columna" de antemano.)
Ahora hago esto iterando a través de toda la tabla en Python y acumulando un dict
de dicts
, que es un poco torpe. Estoy abierto a mejores soluciones, ya sea en Python o SQLite, que darán los datos en forma de tabla.
'itertools' magic es mi tipo favorito de magia. Esperando que alguien más publique una solución SQLite, pero esto ya es mejor que lo que estaba haciendo. –
@ Li-aungYip No hay [soporte] (http://www.sqlite.org/cvstrac/tktview?tn=1424) para tablas dinámicas en SQLite, de ahí las ~ 1000 preguntas aquí en stackoverflow preguntando cómo hacer eso. Pero hay un [módulo perl] (https://github.com/bduggan/SQLite-VirtualTable-Pivot) que hace eso, con un ejemplo [aquí] (http://search.cpan.org/~bduggan/SQLite- VirtualTable-Pivot-0.02/lib/SQLite/VirtualTable/Pivot.pm). – sloth
Terminé usando esto para escribir una función que crea la tabla dinámica como la anterior) y luego la vuelvo a escribir en la base de datos como una tabla temporal. Esto le permite realizar consultas adicionales ('JOIN's, etc.) en los datos pivoteados. Las tablas temporales son feas ya que todas salen, pero "si es estúpido y funciona, no es estúpido". –