• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

GROUP BY przy dwóch i więcej tabelach

Object Storage Arubacloud
0 głosów
405 wizyt
pytanie zadane 26 marca 2018 w SQL, bazy danych przez syzmon9 Początkujący (250 p.)

Drugi dzień męczenia się z jednym zapytaniem do bazy mnie już trochę zirytował. Stąd moja prośba o pomoc i wytłumaczenie co jak i dlaczego ewentualne rozwiązanie zadziała. 

Mianowicie. Mam dwie tabele: filmy oraz rezerwacje:

id  | tytul    | rezyser  
----+----------+--------
5   | Film 1   | Dolan  
6   | Film 2   | Nolan  
7   | Film 3   | Folan  


id  | idFilmu | liczbaBiletow | kino
----+---------+---------------+---------
1   | 5       |  20           | kino1
2   | 6       |  10           | kino1
3   | 5       |  5            | kino3
4   | 7       |  12           | kino2
5   | 7       |  130          | kino1
6   | 6       |  86           | kino3
7   | 6       |  4            | kino4

Muszę napisać zapytanie które zwróci id filmu, tytuł filmu i sumę sprzedanych na niego biletów. W taki sposób że dla podanych tabel wynik będzie przedstawiony w ten sposób: 

id  | tytul    | sumaBiletow  
----+----------+-------------
5   | Film 1   |  25
6   | Film 2   |  100 
7   | Film 3   |  142

Doszedłem do tego że wiem że muszę wykorzystać JOINa i GROUP BY. Stworzyłem coś takiego: 

SELECT filmy.id, filmy.tytul, SUM(rezerwacje.liczbaBiletow) as sumaBiletow 
FROM filmy
INNER JOIN rezerwacje ON filmy.id=rezerwacje.idFilmu
GROUP BY rezerwacje.idFilmu; 

Całe zapytanie nie działa bo nie jest jednoznaczne. Nie mogę znaleźć informacji na temat jak poprawnie skonstruować takie zapytanie gdzie musiał bym połączyć dwie tabele a następnie sortować po pojedynczym elemencie z jednej z tych tabel. Czy ktoś byłby w stanie wytłumaczyć mi w jaki sposób napisać takie zapytanie z wykorzystaniem GROUP BY? I czy JOIN jest tutaj faktycznie niezbędny?

1 odpowiedź

0 głosów
odpowiedź 27 marca 2018 przez Tomasz Rogalski Bywalec (2,800 p.)
wybrane 27 marca 2018 przez syzmon9
 
Najlepsza
SELECT filmy.id, filmy.tytul, SUM(rezerwacje.liczbaBiletow) as sumaBiletow 
FROM filmy
INNER JOIN rezerwacje ON filmy.id=rezerwacje.idFilmu
GROUP BY rezerwacje.idFilmu,rezerwacje.tytul,3;

Spróbuj tego. Albo tego:

SELECT filmy.id, filmy.tytul, SUM(rezerwacje.liczbaBiletow) as sumaBiletow FROM filmy INNER JOIN rezerwacje ON filmy.id=rezerwacje.idFilmu GROUP BY rezerwacje.idFilmu,rezerwacje.tytul;

w groupBy dodałem kolumny. Prawdopodobnie trzeba dodać wszystkie kolumny po za tymi agregującymi (np sum).

komentarz 27 marca 2018 przez syzmon9 Początkujący (250 p.)

Cześć! Dzięki za pomoc. Niestety przy pierwszym zapytaniu jest błąd:

Invalid column name 'tytul'..

W tabeli rezerwacje nie ma kolumny tytuł więc to od razu się nie chce wykonać. Próbowałem jeszcze zmienić rezerwacje.tytul na filmy.tytul ale wtedy dostaje błąd:

Each GROUP BY expression must contain at least one column that is not an outer reference.

Przy drugim zapytaniu jest podobna rzecz :/ Coś nadal tutaj jest nie tak 

komentarz 27 marca 2018 przez Tomasz Rogalski Bywalec (2,800 p.)
SELECT filmy.id, filmy.tytul, SUM(rezerwacje.liczbaBiletow) as sumaBiletow FROM filmy INNER JOIN rezerwacje ON filmy.id=rezerwacje.idFilmu GROUP BY filmy.id,filmy.tytul;

A takie cudo?

komentarz 27 marca 2018 przez syzmon9 Początkujący (250 p.)

Tak! Zadziałało! Czyli GROUP BY przy zapytaniu o 3 kolumny musi zawierać 2 żeby "wiedział" o co chodzi?

I kwestia INNER JOINa - w takiej formie on będzie kreował nową tabelę o nazwie filmy mimo że taka już istnieje i ma w sobie jakieś wartości? Bo tutaj widzę ze GROUP BY jest po tabeli filmy.

I w jednym przypadku byłem bardzo blisko ale tak to jest jak się strzela. Wielkie dzięki za pomoc! Jeszcze jak o tym poczytam więcej to powinienem złapać jak to działa smiley

komentarz 27 marca 2018 przez Tomasz Rogalski Bywalec (2,800 p.)
Group by musi zawierać wszystkie "zwykłe" kolumny z selecta oprócz takich grupujących jak np SUM itp.dlatego tej 3 nie musieliśmy dodawać.

Podobne pytania

+1 głos
2 odpowiedzi 210 wizyt
pytanie zadane 24 marca 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)
+1 głos
2 odpowiedzi 622 wizyt
pytanie zadane 21 marca 2021 w SQL, bazy danych przez Paweł123 Nałogowiec (33,500 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...