Zapytanie SQL - funkcje MAX i COUNT

0

Ćwiczę pisanie wymyślonych przeze mnie zapytań korzystając z bazy umieszczonej pod tym adresem:
http://sqlzoo.net/wiki/More_JOIN_operations#Looking_at_the_id_field.

Napotkałem problem, którego nie potrafię rozwiązać. Mianowicie chciałem wybrać z bazy budżet który najczęściej pojawiał się w danym roku:

ROK | ILOŚĆ WYSTĄPIEŃ | BUDŻET

Udało mi się wyświetlić maksymalną ilość wystąpień budżetu w roku, ale nie potrafię wybrać odpowiadającego mu budżetu. Oto zapytanie, które skonstruowałem:

 Select  n.yr, MAX(n.liczba), n.budget  
FROM
(SELECT budget, yr, COUNT(budget) as liczba 
FROM movie
 group by movie.budget, movie.yr
order by budget desc) as n join movie on ( movie.yr=n.yr and movie.budget )
group by  movie.yr
order by movie.yr desc, MAX(n.liczba) desc 

Z góry dziękuję za pomoc :)

0

a tą bazę masz gdzieś ściągniętą czy działasz na tej stronie?

0

działam na stronie

0

nie wiem czy to dobry pomysł uczyć się sql przez stronę, proste zapytanie select i wywala, że za dużo wierszy
swoją drogą drogą skopiowałem Twoje zapytanie do jakiegoś pola na tej stronie i pokazuje jakieś wartości, czasami pokazana jest wartość null ale chyba tak jest, bo nie które wiersze w budżecie mają tą wartość

0

Wywala za dużo wierszy ponieważ na tej stronie są zadania do wykonania (nad każdym polem, w którym można umieścić zapytanie) i jeżeli zadanie zostanie źle rozwiązane to wypisuje powód (w Twoim przypadku za dużo wierszy). Można podejrzeć prawidłową odpowiedz zjeżdżając na sam dół.
Moje zapytanie jest błędne, dlatego je tutaj wstawiłem - licząc że ktoś pokaże gdzie robię błąd. Dobrze wyświetla rok oraz ilość wystąpień budżetu, ale nie mam pojęcia dlaczego wybiera "losowo" wartość budżetu (stąd te nulle). :)

0
Mqat napisał(a):

Moje zapytanie jest błędne, dlatego je tutaj wstawiłem - licząc że ktoś pokaże gdzie robię błąd. Dobrze wyświetla rok oraz ilość wystąpień budżetu, ale nie mam pojęcia dlaczego wybiera "losowo" wartość budżetu (stąd te nulle). :)

Po pierwsze nie wyświetla Ci poprawnie ilości wystąpień budżetu tam, gdzie ilość budżetu = 1 jest ok, ale weź choćby rok 2008, to Twoje zapytanie wyświetla 17, a

select count(budget) from movie where yr=  2008

już wyświetli 152.

Czemu używasz joint-a do tej samej tabeli?

Rozumiem, że chcesz wyświetlić max wartość budżetu za dany rok.

proste zapytanie sql

select yr, max(budget) as budget, count(budget) as liczba from movie group by yr order by liczba desc;
0

Nie to o co mi chodzi :) . Napisałem zbyt pokrętnie. Spróbuję jeszcze raz. Załóżmy że 2008 roku było 17 filmów o takim samym budżecie. Oczywiście były filmy o innych budżetach np. 10 filmów z budżetem 1 milion, 3 filmy z budżetem 100 000, ale interesuje mnie jedynie największa ilość filmów o takim samym budżecie. Czyli zapytanie powinno wyświetlić ROK: 2008, Ilość filmów o takim samym budżecie: 17 oraz
BUDŻET: 20000000

To już nie jest ta sama tabela :)

1

teraz rozumiem, poniżej zapytanie, które winno Cię satysfakcjonować

select n.yr, max(n.liczba), n.budget from
(select yr, count(budget) as liczba, budget from movie
group by yr, budget
order by liczba desc) as n
group by yr 

kod sprawdzający

select yr, count(budget) as liczba, budget from movie
where yr = 1933
group by budget
order by liczba desc 

Tylko zadanie ma wady w niektórych latach np. 1919 - jest 5 wierszy w czym 4 różne wartości budżetu występują po jednym razie i 1 null, no i którą wartość ma zwrócić zapytanie?

Joint - używaj do łączenia dwóch lub więcej tabel.
Jak chcesz się uczuć SQL to zainstaluj sobie prawdziwą bazę Oracle, Microsoft SQL Server lub Postgresql.

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