Już wiesz

Podstawowa składnia polecenia TRANSFORM, wykorzystywanego w programie MS Access podczas tworzenia kwerend krzyżowych, wygląda następująco:

Linia 1. TRANSFORM SUM otwórz nawias okrągły Wartosc zamknij nawias okrągły. Linia 2. SELECT Wiersze. Linia 3. FROM Tabela. Linia 4. GROUP BY Wiersze. Linia 5. PIVOT Kolumny.

Polecenie PIVOT pozwala ustalić, która kolumna oryginalnej tabeli ma być kolumną zestawienia.

WierszeKolumny to nazwy atrybutów, których wartości mają stać się odpowiednio wierszami i kolumnami.

SUM to jedna z możliwych do zastosowania funkcji agregujących.

Środowisko

Do realizacji omawianych w tym e‑materiale zapytań możemy użyć programu MS Access lub LibreOffice Base.

W programie MS Access wykonywanie poleceń SQL możliwe jest po otwarciu bazy, wybraniu wstążki Tworzenie oraz ikony Projekt kwerendy. Następnie należy zamknąć okno Pokazywanie tabeli i kliknąć ikonę SQL.

Jeżeli zostanie wyświetlone „Ostrzeżenie o zabezpieczeniach”, należy zezwolić na aktywną zawartość, klikając przycisk Włącz zawartość.

W programie LibreOffice Base po otworzeniu bazy, klikamy ikonę Kwerendy, następnie wybieramy Utwórz kwerendę SQL. Po wpisaniu kodu SQL możemy uruchomić kwerendę za pomocą ikony lub używając polecenia Wykonaj kwerendę z menu Edycja. Można również użyć klawisza F5. Zaprojektowaną kwerendę zapisujemy za pomocą polecenia Plik | Zapisz.

Ważne!

Polecenia TRANSFORMPIVOT są rozszerzeniami standardu ANSI SQL obecnymi tylko w MS Access SQL. Aplikacja LibreOffice Base ich nie wspiera. W tym materiale pokażemy polecenia SQL, którymi niekiedy można zastąpić kwerendy używające wspomnianych wyżej rozszerzeń. Omówimy również użycie programu LibreOffice Calc, czyli arkusza kalkulacyjnego, w którym można zdefiniować bazę jako źródło danych i skorzystać z narzędzia tabeli przestawnej.

Kwerendy krzyżowe na wielu tabelach

Czasami konieczne jest wykorzystanie danych zawartych w wielu tabelach w pojedynczej kwerendzie. Jednym ze sposobów rozwiązania tego problemu jest napisanie polecenia SELECT z wykorzystaniem polecenia JOIN.

Przeanalizujmy przykład dwóch tabel należących do bazy danych pewnego hotelu. Tabele zawierają informacje o gościach oraz o wynajętych przez nich pokojach. Pierwsza tabela nazywa się Goscie, druga – Wynajem.

R1EJlMFJN2lvE
Tabela Goscie.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
R1QWkOh07UbES
Tabela Wynajem.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

W tabeli Goscie mamy trzy pola:

  • Nr, czyli pole klucza podstawowego, typ INTEGER (Liczba całkowita),

  • pola tekstowe Imie i Nazwisko – typ TEXT (Krótki tekst).

W tabeli Wynajem mamy:

  • pole klucza podstawowego Nr_pokoju typu INTEGER (Liczba całkowita),

  • pole klucza obcego Nr_goscia typu INTEGER (Liczba całkowita),

  • pole Data typu DATE (Data/Godzina),

  • oraz pole Cena, typ DECIMAL (Waluta) z dwoma miejscami po przecinku.

Powyższe typy danych odpowiadają nazwom ANSI SQL, które wykorzystywane są w widoku projektu tabeli w LibreOffice Base. W nawiasach podaliśmy natomiast nazwy typów danych występujące w MS Access w widoku projektu tabeli.

Pobieramy załączone pliki, które zawierają dane w formacie CSV. Następnie tworzymy bazę danych o nazwie goscie.accdb w programie MS Access lub goscie.odb w programie LibreOffice Base, dodajemy pokazane wyżej tabele i importujemy do nich dane z pobranych plików: goscie.csvwynajem.csv.

RRXiVtAU08ffr

Przycisk do pobrania pliku ZIP z treścią zadania.

Plik ZIP o rozmiarze 473.00 B w języku polskim

Naszym celem jest utworzenie kwerendy krzyżowej, która przedstawi, ile każdy z gości zapłacił za wynajem pokoju w poszczególnych dniach.

Ważne!

W programie MS Access alternatywnym sposobem jest zastosowanie kreatora kwerend. Ponieważ kreator operuje tylko na jednej tabeli, należy najpierw utworzyć Widok, który jest połączeniem dwóch tabel.

Następnie należy utworzyć kwerendę krzyżową – analogicznie jak w pierwszej części tej serii e‑materiałów (Kwerendy krzyżowe, etap IP1GU9QgXzKwerendy krzyżowe, etap I).

Pierwszym krokiem jest zaplanowanie kwerendy. Wiadomo, że imiona i nazwiska gości powinny znaleźć się w nazwach wierszy (to znaczy w rekordach), a daty w nazwach kolumn (alternatywnie kolumny i wiersze można odwrócić).

Potrzebujemy danych z wielu tabel, napiszemy więc polecenie SELECT, zwracające właśnie te dane.

Już wiesz

Polecenie INNER JOIN pozwala na połączenie dwóch tabel na podstawie dwóch pól, klucza podstawowego i obcego, podawanych w klauzuli ON, które tworzą relację między tabelami. Takie połączenie umożliwia zwrócenie danych z wielu tabel w pojedynczej kwerendzie.

Linia 1. SELECT Goscie kropka Imie przecinek Goscie kropka Nazwisko przecinek Wynajem kropka Data przecinek Wynajem kropka Cena. Linia 2. FROM Goscie. Linia 3. INNER JOIN Wynajem. Linia 4. ON Wynajem kropka Nr podkreślnik goscia znak równości Goscie kropka Nr.
RJu8gAtIj4iZv
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Kolejnym krokiem jest dodanie funkcji grupowania. W tym przypadku chcemy pogrupować rekordy zgodnie z rekordami i kolumnami przyszłej kwerendy krzyżowej (pola: Imie, Nazwisko, Data).

W tym celu modyfikujemy kwerendę:

Linia 1. SELECT Goscie kropka Imie przecinek Goscie kropka Nazwisko przecinek Wynajem kropka Data przecinek Wynajem kropka Cena. Linia 2. FROM Goscie. Linia 3. INNER JOIN Wynajem. Linia 4. ON Wynajem kropka Nr podkreślnik goscia znak równości Goscie kropka Nr. Linia 5. GROUP BY Goscie kropka Imie przecinek Goscie kropka Nazwisko przecinek Wynajem kropka Data.
Ważne!

Jeśli stosujemy nazwy tabel lub pól zawierające spację, trzeba zapisać je w cudzysłowach (LibreOffice Base) lub w nawiasach kwadratowych (MS Access). Przywoływana już kwerenda mogłaby wówczas wyglądać następująco:

Linia 1. SELECT Goscie kropka Imie przecinek Goscie kropka Nazwisko przecinek Wynajem kropka Data przecinek Wynajem kropka Cena. Linia 2. FROM Goscie. Linia 3. INNER JOIN Wynajem. Linia 4. ON Wynajem kropka cudzysłów Nr goscia cudzysłów znak równości Goscie kropka Nr. Linia 5. GROUP BY Goscie kropka Imie przecinek Goscie kropka Nazwisko przecinek Wynajem kropka Data.
Ważne!

Zaprezentowana kwerenda nie uruchomi się, ponieważ grupujemy według unikalnego połączenia pól Imie, NazwiskoData, wyświetlając dodatkowo pole Cena. Jednocześnie może istnieć wiele rekordów o tych samych wartościach trzech pierwszych pól, ale różnej cenie. Baza danych nie przeprowadzi żadnych wyszukań, gdy w tabeli znajduje się wiele cen.

Z tego powodu użyjemy funkcji zamieniającej zbiór wartości na jedną wartość. W tym wypadku zastosujemy sumę i uzyskamy sumę pól Cena dla danej osoby na dany dzień.

Linia 1. SELECT Goscie kropka Imie przecinek Goscie kropka Nazwisko przecinek Wynajem kropka Data przecinek. Linia 2. SUM otwórz nawias okrągły Wynajem kropka Cena zamknij nawias okrągły AS Suma podkreślnik cen. Linia 3. FROM Goscie. Linia 4. INNER JOIN Wynajem. Linia 5. ON Wynajem kropka Nr podkreślnik goscia znak równości Goscie kropka Nr. Linia 6. GROUP BY Goscie kropka Imie przecinek Goscie kropka Nazwisko przecinek Wynajem kropka Data.
RX5ovwh25KUez
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Gdy wszystkie konieczne informacje są zebrane i pogrupowane w jednej kwerendzie, można ją zapisać w bazie danych pod nazwą Goscie_Data_Cena. W programie MS Access tak zapisane kwerendy nazywane są widokamiwidokwidokami.

Jeżeli w programie LibreOffice Base uruchomimy edycję w widoku SQL zapisanej kwerendy, w której użyliśmy klauzul(i) INNER JOIN ON, zauważymy kilka zmian w porównaniu do wpisanego przez nas kodu. Po pierwsze, wszystkie nazwy pól i tabel otoczone będą cudzysłowami. Po drugie, nazwy wszystkich tabel źródłowych umieszczone będą w klauzuli FROM, a warunek lub warunki złączenia znajdą się w klauzuli WHERE.

Ciekawostka

Z zapisanych kwerend można korzystać identycznie jak ze zwykłych tabel. Oznacza to, że można projektować kwerendy, których źródłem są wyniki innej kwerendy.

Ostatnim krokiem jest wywołanie kwerendy krzyżowej, która pobiera dane z wyników poprzedniej kwerendy Goscie_Data_Cena. W programie MS Access używamy poleceń TRANSFORMPIVOT:

Linia 1. TRANSFORM SUM otwórz nawias okrągły Suma podkreślnik cen zamknij nawias okrągły. Linia 2. SELECT Imie przecinek Nazwisko. Linia 3. FROM Goscie podkreślnik Data podkreślnik Cena. Linia 4. GROUP BY Imie przecinek Nazwisko. Linia 5. PIVOT Data.

W programie LibreOffice Base równoważnikiem będzie zapytanie wykorzystujące wyrażenie CASE WHEN warunek THEN rezultat END;, które zwraca rezultat, jeżeli warunek jest prawdziwy. Zapytanie przyjmie postać:

Linia 1. SELECT Imie przecinek Nazwisko przecinek. Linia 2. SUM otwórz nawias okrągły CASE WHEN Data znak równości otwórz nawias klamrowy d apostrof 2020 minus 01 minus 01 apostrof zamknij nawias klamrowy THEN Suma podkreślnik cen END zamknij nawias okrągły AS cudzysłów 01 podkreślnik 01 podkreślnik 2020 cudzysłów przecinek. Linia 3. SUM otwórz nawias okrągły CASE WHEN Data znak równości otwórz nawias klamrowy d apostrof 2020 minus 01 minus 02 apostrof zamknij nawias klamrowy THEN Suma podkreślnik cen END zamknij nawias okrągły AS cudzysłów 02 podkreślnik 01 podkreślnik 2020 cudzysłów przecinek. Linia 4. SUM otwórz nawias okrągły CASE WHEN Data znak równości otwórz nawias klamrowy d apostrof 2020 minus 01 minus 03 apostrof zamknij nawias klamrowy THEN Suma podkreślnik cen END zamknij nawias okrągły AS cudzysłów 03 podkreślnik 01 podkreślnik 2020 cudzysłów. Linia 5. FROM Goscie podkreślnik Data podkreślnik Cena. Linia 6. GROUP BY Imie przecinek Nazwisko.

Wyniki kwerendy krzyżowej będą takie jak na załączonych zrzutach, przy czym kolejność rekordów może być inna:

RBiO664jL03TA
Projekt i wynik kwerendy krzyżowej w LibreOffice Base.
RGy7MlytOBwSy
Wynik kwerendy krzyżowej w programie MS Access.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
Dla zainteresowanych

Możliwe jest wykonanie całego polecenia za pomocą pojedynczej kwerendy. W programie MS Access wykonamy następujące zapytanie:

Linia 1. TRANSFORM SUM otwórz nawias okrągły Wynajem kropka Cena zamknij nawias okrągły. Linia 2. SELECT Goscie kropka Imie przecinek Goscie kropka Nazwisko. Linia 3. FROM Goscie. Linia 4. INNER JOIN Wynajem. Linia 5. ON Wynajem kropka Nr podkreślnik goscia znak równości Goscie kropka Nr. Linia 6. GROUP BY Goscie kropka Imie przecinek Goscie kropka Nazwisko. Linia 7. PIVOT Wynajem kropka Data.

W programie LibreOffice Base wykonamy następujące zapytanie:

Linia 1. SELECT Goscie kropka Imie przecinek Goscie kropka Nazwisko przecinek. Linia 2. SUM otwórz nawias okrągły CASE WHEN Wynajem kropka Data znak równości otwórz nawias klamrowy d apostrof 2020 minus 01 minus 01 apostrof zamknij nawias klamrowy THEN Wynajem kropka Cena END zamknij nawias okrągły AS cudzysłów 01 podkreślnik 01 podkreślnik 2020 cudzysłów przecinek. Linia 3. SUM otwórz nawias okrągły CASE WHEN Wynajem kropka Data znak równości otwórz nawias klamrowy d apostrof 2020 minus 01 minus 02 apostrof zamknij nawias klamrowy THEN Wynajem kropka Cena END zamknij nawias okrągły AS cudzysłów 02 podkreślnik 01 podkreślnik 2020 cudzysłów przecinek. Linia 4. SUM otwórz nawias okrągły CASE WHEN Wynajem kropka Data znak równości otwórz nawias klamrowy d apostrof 2020 minus 01 minus 03 apostrof zamknij nawias klamrowy THEN Wynajem kropka Cena END zamknij nawias okrągły AS cudzysłów 03 podkreślnik 01 podkreślnik 2020 cudzysłów. Linia 5. FROM Wynajem przecinek Goscie. Linia 6. WHERE Wynajem kropka Nr podkreślnik goscia znak równości Goscie kropka Nr. Linia 7. GROUP BY Goscie kropka Imie przecinek Goscie kropka Nazwisko.

Zapytanie da identyczny wynik jak kwerenda realizowana w dwóch etapach. Jej zaletą jest zwięzłość, jednak z drugiej strony, podczas jej pisania trudniej sprawdzać wynik kolejnych instrukcji.

Dodatkowo kwerenda (widok) utworzona w ramach kwerendy dwuetapowej może znaleźć zastosowanie w innym elemencie bazy danych.

Podsumowując: sposób tworzenia kwerendy zależy przede wszystkim od preferencji programisty.

Wykorzystanie arkusza kalkulacyjnego

Wadą zapytań podanych dla LibreOffice Base wykorzystujących klauzulę CASE jest to, że musimy z góry wiedzieć, dla jakich konkretnych dat chcemy grupować wartości i wyświetlać je później w kolumnach. Jeżeli wartości jest wiele, nie jest to wygodne rozwiązanie. Wtedy korzystamy z możliwości arkusza kalkulacyjnego LibreOffice Calc.

Po uruchomieniu LibreOffice Calc sprawdzamy, czy potrzebna nam baza jest zarejestrowana jako źródło danych. Wybieramy Widok | Źródła danych. Jeżeli na wyświetlonej liście, nie ma omawianej bazy, musimy ją zarejestrować. Klikamy prawym klawiszem w polu listy i wybieramy polecenie Zarejestrowane bazy danych lub wybieramy Narzędzia | Opcje, a dalej w lewym oknie LibreOffice Base Bazy danych i klikamy przycisk Nowy. W oknie Zarejestrowane bazy danych klikamy Przeglądaj, wskazujemy plik bazy i ewentualnie zmieniamy rejestrowaną nazwę.

R1CwnKQiRyfC6
Źródła danych w programie LibreOffice Calc.

Jeżeli baza jest zarejestrowana i widzimy ją na liście po wybraniu Widok | Źródła danych, wybieramy polecenie DaneTabela przestawna | Wstaw lub edytuj. Następnie w oknie Wybierz źródło zaznaczamy opcję Źródło danych zarejestrowane w LibreOffice. W kolejnym oknie wybieramy bazę, jako typ wybieramy Kwerenda, a jako źródło – kwerendę Goscie_Data_Cena.

Następnie wybieramy polecenie Dane | Tabela przestawna | Wstaw lub edytuj i w oknie Układ tabeli przestawnej projektujemy tabelę. Aby dane zostały pogrupowane, do pola wierszy przeciągamy pola Imie i Nazwisko, a do pola kolumn przeciągamy pole Data. W polu danych umieszczamy pole Suma_cen i pozostawiamy domyślną funkcję agregującą Suma.

R1UEiJrvrWXYt
Projekt tabeli przestawnej w programie LibreOffice Calc.

Słownik

widok
widok

wirtualna tabela tworzona za pomocą zapytania języka SQL, która umożliwia tworzenie podsumowań bez tworzenia nowych tabel; często pozwala to na utrzymanie bazy danych w jednej z postaci normalnych