Grupowanie i wyświetlanie dodatkowych kolumn

0

Witam
Mam problem z utworzeniem zapytania do tabel by jako wynik dostać wszystkie rekordy z pierwszej tabeli z dodatkową kolumną która będzie zawierać liczbę rekordów z innej tabeli...

Przykład

  1. Mam tabele Aktorzy i Filmy
  2. Chcę zrobić by wyświetliło aktorów wraz z liczbą filmów w których wystąpili

Stworzyłem takie zapytanie (kolumn w takAktorzy będzie docelowo więcej):

 
SELECT     tabAktorzy.ID, tabAktorzy.Name, COUNT(*) AS LiczbaFilmow
FROM         tabAktorzy INNER JOIN
                      laczFilmAkt ON tabAktorzy.ID = laczFilmAkt.IDAktora
GROUP BY tabAktorzy.LiczbaFilmow

Jednakże po jego wykonaniu wyskakuje bład:

In aggregate and grouping expressions, the SELECT clause can contain only aggregates and grouping expressions.

Wiem o co w nim chodzi (o usunięcie kolumny Name z SELECT), ale same ID i liczba plików nie zadawala mnie

0

Ale problem jest w tym, że kilku aktorów może mieć taką samą liczbę filmów i wtedy nie możesz podać nazwiska aktora, bo jest dwóch, trzech i więcej. Powinieneś raczej grupować po nazwisku lub id a nie po liczbie filmów

0

Dzięki bardzo, rozwiązałeś przyszły problem ;]
Ale dalej nie wiem jak zrobić by były kolumny (imię, nazwisko, adres itd) oraz dodatkowo liczba filmów.
Chyba że stworze dodatkową kolumnę w tabeli aktor i za każdym razem będę ją aktualizował jak dojdzie jakiś film z aktorem...

0
Początkujący napisał(a)

Dzięki bardzo, rozwiązałeś przyszły problem ;]
Ale dalej nie wiem jak zrobić by były kolumny (imię, nazwisko, adres itd) oraz dodatkowo liczba filmów.
Chyba że stworze dodatkową kolumnę w tabeli aktor i za każdym razem będę ją aktualizował jak dojdzie jakiś film z aktorem...

A dlaczego przyszły?

SELECT     tabAktorzy.ID, tabAktorzy.Name, tabAktorzy.LastName, tabAktorzy.Address, COUNT(*) AS LiczbaFilmow
FROM         tabAktorzy INNER JOIN
                      laczFilmAkt ON tabAktorzy.ID = laczFilmAkt.IDAktora
GROUP BY tabAktorzy.ID,tabAktorzy.Name, tabAktorzy.LastName, tabAktorzy.Address

EDIT
Poprawione na faktycznie działające, ale przekombinowane. Sposób massther'a jest dobry, a to co napisałem ma prawo działać tylko w tej konkretnej sytuacji

1

Może garść teorii, jak masz grupowanie, to w select możesz mieć tylko kolumny po których grupujesz oraz wynik funkcji agregujących.

W tym przypadku najpierw zliczenie liczby filmów, a później złączenie wg mnie jest lepszym pomysłem.

select a.*, COALESCE(m.numOfMovies, 0) from Aktorzy a
left join (select actorId, count(*) as numOfMovies from filmy group by actorId) as m on a.actorId = m.acorId
0

Wielkie dzięki massther

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