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

Podzapytanie w klauzurze WHERE z agregacją i grupowaniem

Object Storage Arubacloud
0 głosów
206 wizyt
pytanie zadane 14 maja 2023 w SQL, bazy danych przez rafaldo12 Nowicjusz (120 p.)

Witam, od niedawna uczę się SQL i mam problem z pewnym zadaniem, proszę o pomoc. Używam SSMS.

Posiadam trzy tabele w mojej bazie danych: zamówienia, towary, klienci:

 

Zadanie 1: Wybranie najdroższego zamówienia dla każdego z towarów i wyświetlenie kto je zamówił (id,imie,nazwisko,data,wartość). Napisałem kod:

select zamowienia.id, klienci.imie, klienci.nazwisko, zamowienia.data, zamowienia.wartosc, zamowienia.towar_id, towary.nazwa from zamowienia,klienci,towary
where zamowienia.wartosc in
(select max(zamowienia.wartosc) from zamowienia group by zamowienia.towar_id) and 
(klienci.id=zamowienia.klient_id) and 
(towary.id=zamowienia.towar_id);

rezultatem tego zapytania jest:

i tutaj pojawia się problem. Dlaczego wyświetla mi rekord pierwszy? Dla śrubek największa wartość zamówienia to 15,88. Rekord pierwszy nie powinien zostać wyświetlony. Co więcej jeśli wykonam samo podzapytanie:


select max(zamowienia.wartosc) from zamowienia group by zamowienia.towar_id;

To liczba rekordów i wartości się zgadzają.

Zadanie 2: Chciał bym zsumować wartości zamówień dla każdego z klientów. Czyli mam pięciu klientów i chce wyświetlić ich imie,nazwisko i sume jaką u mnie wydali. Zupełnie nie wiem jak się za to zabrać, proszę o pomoc.

1 odpowiedź

+1 głos
odpowiedź 14 maja 2023 przez adrian17 Ekspert (344,860 p.)

To liczba rekordów i wartości się zgadzają.

No, nie, to jest dokładnie powód dlaczego masz taki problem.

Masz rekord o wartości 12.44. To podzapytanie nic nie mówi o tym że to jest wartość dla płaskowników - to zapytanie zwróciło Ci tylko kilka liczb. No i Twoje `where in` znalazło że zapytanie na śrubki miało wartość 12.44 więc pasuje.

Musisz przy łączeniu sprawdzić że zarówno wartość jak i typ pasują.

BTW, zamiast łączyć tabele używając `from a,b,c` zacznij używać JOINów ;)

Co do zad2, brzmi jak zwykły GROUP BY z funkcją sum?

komentarz 14 maja 2023 przez rafaldo12 Nowicjusz (120 p.)

Rozumiem już swój błąd i działanie tego zapytania, dzięki.

Napisałem coś takiego:

select id, towar_id, wartosc from zamowienia
where wartosc = (select max(wartosc) from zamowienia as zam2 where zamowienia.towar_id=zam2.towar_id)
order by towar_id;

Działa to dobrze ale nie do końca rozumiem to zapytanie gdyż napisałem je intuicyjnie na podstawie lekcji z podręcznika SQL. Możesz mi wyjaśnić kilka rzeczy?

Pytanie 1: czemu przy klauzurze "where" mogłem użyć "=" zamiast "in" skoro wyrażenie 

select max(wartosc) from zamowienia as zam2 where zamowienia.towar_id=zam2.towar_id

musi zwrócić co najmniej trzy wartości czyli max dla każdego typu towaru?

Pytanie 2: Jak działa to podzapytanie skoro tam nie ma żadnego grupowania?

Pytanie 3: Czym jest alias "zam2"? On zawiera jedną wartość czy tabelę? Jak można  sprawdzić co on zawiera?

Odnośnie zadania 2, czy zapytanie jest poprawne, pomijając joiny o których mi mówiłeś?

select zamowienia.klient_id, klienci.imie, klienci.nazwisko,  sum(zamowienia.wartosc) from zamowienia, klienci
where zamowienia.klient_id=klienci.id
group by zamowienia.klient_id,klienci.imie,klienci.nazwisko;

 

Podobne pytania

+1 głos
2 odpowiedzi 1,048 wizyt
pytanie zadane 28 stycznia 2021 w SQL, bazy danych przez Misiek Mądrala (5,300 p.)
–2 głosów
1 odpowiedź 321 wizyt
pytanie zadane 26 września 2019 w SQL, bazy danych przez Wujciorada Nowicjusz (190 p.)
0 głosów
0 odpowiedzi 203 wizyt

92,550 zapytań

141,394 odpowiedzi

319,522 komentarzy

61,935 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!

...