Grupowanie i wyświetlanie dodatkowych kolumn

Odpowiedz Nowy wątek
2011-08-23 11:48
Początkujący
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

Pozostało 580 znaków

2011-08-23 11:56
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

edytowany 1x, ostatnio: Sarrus, 2011-08-23 11:58

Pozostało 580 znaków

2011-08-23 12:15
Początkujący
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...

Pozostało 580 znaków

2011-08-23 12:40
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

edytowany 1x, ostatnio: Sarrus, 2011-08-24 08:08

Pozostało 580 znaków

2011-08-23 12:40
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

Pozostało 580 znaków

2011-08-23 13:47
Początkujący
0

Wielkie dzięki massther

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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