Vorrei un modo per riepilogare una tabella di database in modo che le righe che condividono un ID comune vengano riepilogate in una riga di output.Produrre una tabella di riepilogo ("pivot"?)
I miei strumenti sono SQLite e Python 2.x.
Ad esempio, data la seguente tabella dei prezzi della frutta ai miei supermercati locali ...
+--------------------+--------------------+--------------------+
|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 |
+--------------------+--------------------+--------------------+
... voglio produrre una tabella riassuntiva che mostra me il prezzo di ogni frutto in ogni supermercato. Gli spazi vuoti dovrebbero essere occupati da 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 |
+----------+----------+----------+----------+
Credo che la letteratura definisce questa una "tabella pivot" o di una "interrogazione pivot", ma a quanto pare SQLite doesn't support PIVOT
. (La soluzione in questa domanda utilizza in hardcoded LEFT JOIN
s. Questo in realtà non appello perché ho don conoscere i nomi di "colonna" in anticipo.)
In questo momento lo faccio iterando attraverso l'intera tabella in Python e accumulando uno dict
di dicts
, che è un po 'klutzy. Sono aperto a soluzioni migliori, sia in Python che in SQLite, che forniranno i dati in forma tabellare.
La magia di 'itertools' è il mio genere di magia preferito. Sperando che qualcun altro pubblichi una soluzione SQLite, ma questo è già migliore di quello che stavo facendo. –
@ Li-aungYip C'è [nessun supporto] (http://www.sqlite.org/cvstrac/tktview?tn=1424) per le tabelle pivot in SQLite, quindi le ~ 1000 domande qui su StackOverflow che chiedono come farlo. Ma c'è un [perl module] (https://github.com/bduggan/SQLite-VirtualTable-Pivot) che lo fa, con un esempio [qui] (http://search.cpan.org/~bduggan/SQLite- VirtualTable a perno-0,02/lib/SQLite/VirtualTable/Pivot.pm). – sloth
Ho finito usando questo per scrivere una funzione che crea la tabella pivot come sopra) e poi la scrive sul database come una tabella temporanea. Ciò consente di eseguire ulteriori query ('JOIN's, ecc.) Sui dati pivot. I tavoli temporanei sono brutti come tutti escono, ma "se è stupido e funziona, non è stupido". –