Jeśli mam tabelę MySQL wyglądającą mniej więcej tak:
nazwa_działania akcja liczba stron ------------------------------- Firma A DRUKUJ 3 Firma A DRUKUJ 2 Firma A DRUKUJ 3 Firma B EMAIL Firma B DRUKUJ 2 Firma B DRUKUJ 2 Firma B WYDRUK 1 Firma A DRUKUJ 3
Czy można uruchomić zapytanie MySQL, aby uzyskać dane wyjściowe w następujący sposób:
nazwa firmy EMAIL DRUKUJ 1 strony DRUKUJ 2 strony DRUKUJ 3 strony -------------------------------------------------- ----------- Firma A 0 0 1 3 Firma B 1 1 2 0
Chodzi o to, że pagecount
może się zmieniać, więc kwota wyjściowa kolumna powinna odzwierciedlać, że jedna kolumna dla każdego action
/ pagecount
pary, a następnie liczba odsłon company_name
. Nie jestem pewien, czy nazywa się to tabelą przestawną, ale ktoś to sugerował?
Odpowiedzi:
Zasadniczo jest to tabela przestawna.
Miły samouczek, jak to osiągnąć, można znaleźć tutaj: http://www.artfulsoftware.com/infotree/qrytip.php?id=78
Radzę przeczytać ten post i dostosować to rozwiązanie do swoich potrzeb.
Aktualizacja
Ponieważ powyższy link nie jest już dostępny, czuję się zobowiązany do podania dodatkowych informacji dla was wszystkich, którzy szukają tutaj odpowiedzi mysql pivot. Naprawdę miał ogromną ilość informacji i nie umieszczę tutaj wszystkiego (tym bardziej, że po prostu nie chcę kopiować ich ogromnej wiedzy), ale dam kilka wskazówek, jak radzić sobie z osią przestawną tabele sql ogólnie na przykładzie z peku, który zadał pytanie w pierwszej kolejności.
Może link wkrótce wróci, będę go pilnować.
Sposób arkusza kalkulacyjnego ...
Wiele osób korzysta w tym celu z narzędzi takich jak MSExcel, OpenOffice lub innych narzędzi do obsługi arkuszy kalkulacyjnych. To prawidłowe rozwiązanie, po prostu skopiuj tam dane i skorzystaj z narzędzi oferowanych przez GUI, aby to rozwiązać.
Ale ... to nie było pytanie, a może nawet prowadzić do pewnych wad, takich jak sposób wprowadzenia danych do arkusza kalkulacyjnego, problematyczne skalowanie i tak dalej.
Sposób SQL ...
Biorąc pod uwagę jego stół wygląda mniej więcej tak:
Teraz spójrz na jego / jej pożądany stół:
Wiersze (
EMAIL
,PRINT x pages
) przypominają warunki. Główne ugrupowanie tocompany_name
.Aby skonfigurować warunki, raczej krzyczy o użyciu
CASE
-statement. W celu grupy przez coś, dobrze, stosowanie ...GROUP BY
.Podstawowy SQL zapewniający ten element przestawny może wyglądać mniej więcej tak:
Powinno to zapewnić bardzo szybko pożądany wynik. Głównym minusem tego podejścia jest to, że im więcej wierszy chcesz w tabeli przestawnej, tym więcej warunków musisz zdefiniować w instrukcji SQL.
Można to również rozwiązać, dlatego ludzie używają gotowych instrukcji, procedur, liczników i tym podobnych.
Kilka dodatkowych linków na ten temat:
źródło
Moje rozwiązanie jest w języku T-SQL bez żadnych elementów przestawnych:
źródło
SUM()
może działać tylko z danymi liczbowymi, jeśli chcesz przestawić ciągi, których będziesz musiał użyćMAX()
SUM(CASE WHEN (action='PRINT' AND pagecount=1) THEN 1 ELSE 0 END)
, możesz to zrobić,SUM(action='PRINT' AND pagecount=1)
ponieważ warunek zostanie przekształcony na1
true, a0
falseW przypadku MySQL możesz bezpośrednio ustawić warunki w
SUM()
funkcji, która będzie oceniana jako wartość logiczna0
lub,1
dzięki czemu będziesz mógł liczyć na podstawie kryteriów bez użyciaIF/CASE
instrukcjiDEMO
źródło
crosstab()
funkcję.W celu dynamicznego przestawienia użyj
GROUP_CONCAT
zCONCAT
. Funkcja GROUP_CONCAT łączy łańcuchy z grupy w jeden ciąg z różnymi opcjami.DEMO TUTAJ
źródło
Wersja stardard-SQL wykorzystująca logikę logiczną :
SQL Fiddle.
W jaki sposób?
TRUE OR NULL
dajeTRUE
.FALSE OR NULL
dajeNULL
.NULL OR NULL
dajeNULL
.I
COUNT
liczy tylko wartości inne niż null. Voilá.źródło
Prawidłowa odpowiedź to:
źródło
other_value
stołu?SET
zapytania, aby zwiększyć wartość domyślną, która jest ograniczona do 1024 dla GROUP_CONCAT po 1024 GROUP_CONCAT po prostu obcina ciąg bez błędu, co oznacza, że mogą wystąpić nieoczekiwane wyniki.Istnieje narzędzie o nazwie Generator tabeli przestawnej MySQL, które może pomóc w tworzeniu internetowej tabeli przestawnej, którą można później wyeksportować do programu Excel (jeśli chcesz). może działać, jeśli dane znajdują się w jednej tabeli lub w kilku tabelach.
Wszystko, co musisz zrobić, to podać źródło danych kolumn (obsługuje kolumny dynamiczne), wiersze, wartości w treści tabeli i relacje między tabelami (jeśli takie istnieją)
Strona główna tego narzędzia to http://mysqlpivottable.net
źródło
źródło