Zapytanie SQL - 3 tabele

0

Witam, chcę wykonać zapytanie które da mi "liste 5 aktorów ktorzy grali w największej ilości filmów"
mam taką bazę.
screenshot-20180124160923.png

0
Patryk Mularczyk napisał(a):

Witam, chcę wykonać zapytanie które da mi "liste 5 aktorów ktorzy grali w największej ilości filmów"
mam taką bazę.
screenshot-20180124160923.png

W tabeli AKTOR_FILM zrobć count na ID_FILMU i pogrupuj po ID_AKTORA - bedziesz miał dla kazdego ID_AKTORA ilosc filmów. Połącz z tabela AKTOR zeby wyciagnac dane AKTORA.
Na count(ID_FILMU) zrobc cos w stylu: rank() OVER (ORDER BY count(ID_FILMU)) as rank -- piszę z pamięcie może być coś źle. Będzie miał dla każdego AKTORA, Count(ID_FILMU), RANK -- posortuj po rank zeby zobaczyc czy ok i na koncu warunek daj raunek: rank <= 5.

0

ok, mam coś takiego:

select DISTINCT aktor.IMIE, aktor.NAZWISKO, aktor.ID_AKTORA, FILM.ID_FILMU, film.TYTUL
from dbo.AKTOR_film inner join dbo.film on dbo.AKTOR_film.ID_FILMU = dbo.FILM.ID_FILMU
inner join dbo.AKTOR on dbo.AKTOR_FILM.ID_AKTORA = dbo.AKTOR.ID_AKTORA" co mi daję:
screenshot-20180124163138.png

tylko nie wiem jak to teraz pogrupować aby wyświetlało zsumowaną liczbę filmów przy aktorze

1
Patryk Mularczyk napisał(a):

ok, mam coś takiego:

select DISTINCT aktor.IMIE, aktor.NAZWISKO, aktor.ID_AKTORA, FILM.ID_FILMU, film.TYTUL
from dbo.AKTOR_film inner join dbo.film on dbo.AKTOR_film.ID_FILMU = dbo.FILM.ID_FILMU
inner join dbo.AKTOR on dbo.AKTOR_FILM.ID_AKTORA = dbo.AKTOR.ID_AKTORA" co mi daję:
screenshot-20180124163138.png

tylko nie wiem jak to teraz pogrupować aby wyświetlało zsumowaną liczbę filmów przy aktorze

Zrob cos takiego tlyko przełóż to na swoje tabele:

SELECT
  TMP.NAME,
  TMP.RANK
FROM
  (
    SELECT
      D.VENDOR_ID   AS ID,
      D.VENDOR_NAME AS NAME,
      COUNT(DISTINCT DD.VENDOR_SITE_ID) COUNT_SITE_ID,
      RANK() OVER (ORDER BY COUNT(DISTINCT DD.VENDOR_SITE_ID) DESC) AS RANK
    FROM
      XX_PO_VENDORS_DS D,
      XX_PO_VENDOR_SITES_DS DD
    WHERE
      D.VENDOR_ID = DD.VENDOR_ID
    GROUP BY
      D.VENDOR_ID,
      D.VENDOR_NAME
    ORDER BY
      COUNT(DD.VENDOR_SITE_ID) DESC
  ) tmp
WHERE TMP.RANK <= 5;

Tylko zamiast łączenia w where użyj normalnego joina.
W moim przypadku tabela D i VENDOR_NAME - VENDOR_ID to u Ciebie aktorzy, a count po VENDOR_SITE_ID to count na ID_FILMU.

1
select a.imie, a.nazwisko, l.ilosc from (select top 5 id_aktora, count(id_aktora) ile from aktor_film group by id_aktora order by count(id_aktora) desc) l inner join aktor a on (l.id_aktora=a.id_aktora)

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