Chciałbym podsumować tabelę bazy danych, aby wiersze udostępniające wspólny identyfikator były podsumowane w jednym wierszu danych wyjściowych.Tworzenie tabeli podsumowania ("pivot"?)
Moje narzędzia to SQLite i Python 2.x.
Na przykład podano w poniższej tabeli cen owoców w moich lokalnych supermarketach ...
+--------------------+--------------------+--------------------+
|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 |
+--------------------+--------------------+--------------------+
... Chcę stworzyć tabelę podsumowującą pokazując mi cenę każdego owocu w każdym supermarkecie. Puste miejsca powinny być wypełnione przez 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 |
+----------+----------+----------+----------+
wierzę w literaturze nazywa to „tabela pivot” lub „zapytanie pivot”, ale widocznie SQLite doesn't support PIVOT
. (Rozwiązanie w tym pytaniu używa jawnie wpisanej LEFT JOIN
s. To naprawdę nie odwołania się do mnie, bo don „t znać nazwy«kolumna»z wyprzedzeniem).
teraz robię to przez iteracja całej tabeli w Pythonie i akumulowanie dict
z dicts
, który jest nieco klutzy. Jestem otwarty na lepsze rozwiązania w Pythonie lub SQLite, które podadzą dane w formie tabelarycznej.
'itertools' magic to mój ulubiony rodzaj magii. Mamy nadzieję, że ktoś inny opublikuje rozwiązanie SQLite, ale to już jest lepsze niż to, co robiłem. –
@ Li-aungYip Nie ma [brak wsparcia] (http://www.sqlite.org/cvstrac/tktview?tn=1424) dla tabel przestawnych w SQLite, stąd ~ 1000 pytań tutaj na stackoverflow pytając, jak to zrobić. Ale istnieje moduł [perl] (https://github.com/bduggan/SQLite-VirtualTable-Pivot), który to robi, na przykład [tutaj] (http://search.cpan.org/~bduggan/SQLite- VirtualTable-Pivot-0.02/lib/SQLite/VirtualTable/Pivot.pm). – sloth
Skończyło się na tym, aby napisać funkcję, która tworzy tabelę przestawną, jak powyżej), a następnie zapisuje go z powrotem do bazy danych jako tabeli tymczasowej. Pozwala to na wykonywanie dalszych zapytań ('JOIN's, itp.) Na danych przestawnych. Stoły tymczasowe są brzydkie, ponieważ wszystkie się wydostają, ale "jeśli to głupie i działa, to nie jest głupie". –