SQL - zapytanie join | group by

0

Witam,

Mam dwie tabele: customer i order. Są w relacji customer.id = order.CustomerId. Próbuje wykonać zapytanie, które pokaże 10 klientów z największą ilością zamówień. Chcę w wyniku mieć imię i nazwisko (połączone dwie kolumny z tabeli customer i ilość zamówień danego klienta). Na tę chwilę mam...

select concat(c.FirstName, ' ', c.LastName)
from [order] o
left join customer c on o.CustomerId = c.Id

Zatrzymałem się na tym, że wynikiem jest kolumna z imieniem i nazwiskiem, ilość powtórzeń klienta ok, ale nie ma grup by, które nie mogę połączyć z joinem. Pomożecie?

Poniżej moja ostatnia próba:

select concat(c.FirstName, ' ', c.LastName) as imie_nazwisko, count(o.CustomerId)
from [order] o
left join customer c on o.CustomerId = c.Id
group by o.CustomerId

Bez group by i joina w jednym zapytania wszystko działa, mam problem z połączeniu.

0

Group by musisz zrobić na kolumnach ktore występują w selekcie. Musisz tez to posortowac po ilości zliczeń i wziąć tylko 10 z góry (top 10)

0

@UglyMan: Tak, takie próby już robiłem, ale mam problem z połączneniem group by, order by z joinem.

Miałem takie zapytanie (nie powiodło się):

select top 10 concat(c.FirstName, ' ', c.LastName) as imie_nazwisko, count(o.CustomerId) as ilosc
from [order] o
left join customer c on o.CustomerId = c.Id
group by o.CustomerId
order by ilosc desc

Bez joina (jest ok, ale to niepełne zapytanie):

select top 10 count(o.CustomerId) as ilosc
from [order] o
group by o.CustomerId
order by ilosc desc

Z joinem, ale bez group by i order by (jest ok, ale to niepełne zapytanie):

select top 10 concat(c.FirstName, ' ', c.LastName) as imie_nazwisko
from [order] o
left join customer c on o.CustomerId = c.Id
0

Jak wyciągasz połączenie first name i last name z klienta to musisz grupować po tych kolumnach a nie po id. I fajnie jak byś się dzielił błędem jaki masz w swojej ostatniej wersji zapytania.

0

@UglyMan: Dzięki, zadziałało.

select top 10 concat(c.FirstName, ' ', c.LastName) as imie_nazwisko, count(o.CustomerId) as ilosc
from [order] o
left join customer c on o.CustomerId = c.Id
group by o.CustomerId, concat(c.FirstName, ' ', c.LastName)
order by ilosc desc

W ramach wyjaśnienia... Wszystkie kolumny muszą pojawić się w group by, które wyciągamy z wyjątkiem agregujących? Zarówno jeśli pobieramy z jednej tabeli, jak i z wielu?

0

Tak w group by musisz mieć wszytko co wyciągasz i nie masz na tym funkcji agregujące.

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