sprawdzenie poprawnosci zapytania

0

StacjeN(IdStacji,miasto,CenaZjazdu),
Narciarze(IdNarciarza,imie,nazwisko,RokUr),
Zjazdy(IdStacji,IdNarciarza,Data,IloscZjazdow)

Pokaz:
Dla kazdego narciarza jego imie nazwisko oraz łaczna ilosc zjazdow wykonanych przez niego w roku 2017.

Select Narciarze.imie,Narciarze.nazwisko,Sum(Zjazdy.IloscZjazdow) from Narciarze,Zjazdy where Zjazdy.Data=2017 AND Narciarze.IdNarciarza=Zjazdy.IdNarciarza group by Narciarze.Imie,Narciarze.Nazwisko
1

Zamysł dobry, ale co jeśli 2 (lub więcej) narciarzy ma takie samo imię i nazwisko? Możesz dorzucić do group by IdNarciarza.

0
yarel napisał(a):

Możesz dorzucić do group by IdNarciarza.

Jak dorzuci IdNarciarza to po co imię i nazwisko w GROUP BY?

0
TomRiddle napisał(a):
yarel napisał(a):

Możesz dorzucić do group by IdNarciarza.

Jak dorzuci IdNarciarza to po co imię i nazwisko w GROUP BY?

Bez imie, nazwisko w GROUP BY potrzebna będzie funkcja agregująca typu MAX/MIN.

0
yarel napisał(a):
TomRiddle napisał(a):
yarel napisał(a):

Możesz dorzucić do group by IdNarciarza.

Jak dorzuci IdNarciarza to po co imię i nazwisko w GROUP BY?

Bez imie, nazwisko w GROUP BY potrzebna będzie funkcja agregująca typu MAX/MIN.

Noi? Bez sensu dodawać imię i nazwisko w GROUP BY skoro będą takie same dla tego samego id - zaciemnisz tylko intencje query. Poza tym, wszystko jedno jakiej funkcji agregującej użyjesz bo każdy input będzie taki sam, możesz wziąć FIRST(), LAST(), OVER() zależnie od bazy.

0
TomRiddle napisał(a):

Noi? Bez sensu dodawać imię i nazwisko w GROUP BY skoro będą takie same dla tego samego id - zaciemnisz tylko intencje query. Poza tym, wszystko jedno jakiej funkcji agregującej użyjesz bo każdy input będzie taki sam, możesz wziąć FIRST(), LAST(), OVER() zależnie od bazy.

  1. Bez sensu to odważnie powiedziane, zważywszy, że bez tych atrybutów w GROUP BY zapytanie na normalnej bazie po prostu nie zadziała ;-)

Tabelka z 2 kolumnami i danymi:
A | B
--+---
1 | X
1 | Y
2 | Z
2 | A

Co według Ciebie silnik ma zwrócić w takim przypadku GROUP BY?

SELECT b from TABELKA GROUP BY a; 

Silnikowi wszystko jedno czy logicznie A=ID, zaś B=Naziwsko, czy może logicznie A=Foo i B=Bar. Silnik wie po czym ma grupować, ale nie wie jaką wartość per grupa ma wziąć. Normalny silnik zwróci pewnie coś przewidywalnego typu 'nie umiem tego agregować', mniej normalny pewnie coś pierwszego z brzegu (na tych samych danych i dla tego samego zapytania różne wyniki - słabo).

W świecie MySQL takie zapytanie przejdzie, może to ukłon w kierunku ziomków ze świata PHP, który mają problemy z pisaniem joinów i group by? Nie wiem.
Dla porządku sprawdziłem i przechodzi na MySQL 5.5, ale już na MySQLu 8 poszli po rozum do głowy i naprawili:

https://www.db-fiddle.com/f/eC2e1gMcJEaA17TCy8oYLx/0

Query Error: Error: ER_WRONG_FIELD_WITH_GROUP: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.foo.imie' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
  1. Co do funkcji agregującej to pisałem, że takowa będzie potrzebna. Nie upieram się na konkretną, ale nie widzę potrzeby listowania wszystkich, które można wykorzystać w tym przypadku.

Reasumując, jak dla mnie nie jest to bez sensu, tylko poprawnie.

2

@yarel, tak nie do końca prawda jest to co napisałeś...
Zarówno MySQL, jak i postgreSQL potrafią poprawnie pogrupować po kolumnie KLUCZA, nie wymieniając pozostałych pól z danej tabeli. W Twoim przykładzie zabrakło definicji PRIMARY KEY: https://www.db-fiddle.com/f/jPJbBD8Uy8vUChpmz1ZEUB/0

1 użytkowników online, w tym zalogowanych: 0, gości: 1