Zadanie z łączenia tabel + wyszukania najtańszych produktów

0

Witam,

Studiuję na 1 roku i dostałem takie zadanie:

Pracujemy na bazie Northwind ma ona kilka tabel połączonych ze sobą i trzeba wyciągnąć pewne informacje:

Podaj nazwy najtańszego produktu(produktów jeżeli kilka ma taką samą cenę) z każdej kategorii, nazwy tych kategorii i ich ceny (Najtańsze produkty z każdej kategorii)

No i ja to zrobiłem, ale takim rzemieślniczym sposobem:
select distinct ProductName,
CategoryName,
p.UnitPrice
from Categories c join Products p on c.CategoryID = p.CategoryID
join [Order Details] od on p.ProductID = od.ProductID

			  where 
					p.unitprice = (select top 1 UnitPrice from products
								   where CategoryID = 1
								   order by unitprice asc) 
								   and c.CategoryID = 1

								   or 
			  
				    p.unitprice = (select top 1 UnitPrice from products
								   where CategoryID = 2
								   order by unitprice asc)	
								   and c.CategoryID = 2

								    or 
			  
				    p.unitprice = (select top 1 UnitPrice from products
								   where CategoryID = 3
								   order by unitprice asc)	
								   and c.CategoryID = 3

								   or 
			  
				    p.unitprice = (select top 1 UnitPrice from products
								   where CategoryID = 4
								   order by unitprice asc)	
								   and c.CategoryID = 4

								   or 
			  
				    p.unitprice = (select top 1 UnitPrice from products
								   where CategoryID = 5
								   order by unitprice asc)	
								   and c.CategoryID = 5

								   or 
			  
				    p.unitprice = (select top 1 UnitPrice from products
								   where CategoryID = 6
								   order by unitprice asc)	
								   and c.CategoryID = 6

								   or 
			  
				    p.unitprice = (select top 1 UnitPrice from products
								   where CategoryID = 7
								   order by unitprice asc)	
								   and c.CategoryID = 7

								   or 
			  
				    p.unitprice = (select top 1 UnitPrice from products
								   where CategoryID = 8
								   order by unitprice asc)	
								   and c.CategoryID = 8
			  order by p.UnitPrice

Moja prośba jest taka. Nie chcę gotowej odpowiedzi, ale jakiegoś naprowadzenia co mógłbym zrobić, aby to zapytanie było proste.

0

Poczytaj o funkcjach agregujących (potrzebujesz MIN()) i klauzulach having oraz group by.

0

Myślę i myślę... Niestety nic mi nie przychodzi do głowy. Wiem mniej więcej jak działa having i order by i funkcje agregujące.

Nie ma problemu, żeby wskazał najtańszy produkt z jednej kategorii. Jak zrobić to gdy mam 8 różnych kategorii?

0

Twoje zpytanie jest złe. Nie tylko dlatego, że wypisujesz kategorie po kolei. Ale dltego, że możesię zdarzyć, że towar w kategorii 1 będzie miał taką cenę, jak najniższ cena w kategorii 2. I też wtedy będzie wyświetlony.
Musisz zrobić sobie tabelkę (albo podzapytanie), które da ci najniższą cenę w daneych kategoriach. Czyli:

SELECT kategoria, Min(cena) cena_minimalna FROM tabela group BY kategoria

I potem ten wynik polączyć z tabelą by wybrać produkty, które są w danych kategoriach o danej cenie. Uwaga - wcale nie jest powiedziane, że to będzie jeden produkt.
Możesz to zrobić dwojako (choć nie wiem, czy pierwszy sposób przejdze na MS SQL)

SELECT * FROM tabela WHERE (kategoria, cena) IN (poprzednie zapytanie)

Lub sposób bardziej elegancki (bardziej bazodanowy - poprzedni był bardziej zgodny z naturlnym językiem)

SELECT * FROM tabela JOIN (poprzednie zapytanie) x ON x.kategoria=tabela.kategoria AND x.cena_minimalna=tabela.cena
0

Niestety, sposób nie przechodzi w MS SQL, ponieważ to zapytanie wyświetla dwie kolumny (categoryname i unitprice) co nie przechodzi w komendzie "IN", ponieważ tam mogą być tylko wartości tego samego typu co przed "IN" czyli w tym przypadku liczby, dlatego usunąłem kolumnę categoryname.

SELECT ProductName, CategoryName, UnitPrice 
FROM Categories c join Products p on c.CategoryID = p.CategoryID

WHERE UnitPrice IN (SELECT MIN(unitprice) as 'cena_minimalna' 
					FROM Categories c join Products p on c.CategoryID = p.CategoryID
					Group by CategoryName)
Order by Unitprice

Problem jest taki, że on mi wyciąga wszystkie nazwy produktów w poszczególnych kategoriach, które mają ceny najniższych cen w poszczególnych kategoriach.

Przez to, np. wyświetlił mi dwa produkty z tej samej kategorii (jeden z ceną najniższą, a drugi z ceną najniższą ale innej kategorii)

[url=http://fotozrzut.pl/][img]http://fotozrzut.pl/zdjecia/a8a2c38b11.png[/img][/url]

0

Witam na forum.
Może tak spróbuj:
SELECT ProductName, CategoryName, UnitPrice
FROM(
SELECT ProductName, CategoryName, UnitPrice, P.CategoryID
FROM Products AS P INNER JOIN Categories AS C ON P.CategoryID = C.CategoryID) AS T1
INNER JOIN (
SELECT CategoryID, MIN(UnitPrice) AS MP
FROM Products
GROUP BY CategoryID) AS T2 ON T1.CategoryID =T2.CategoryID AND T1.UnitPrice = T2.MP
Pozdrawiam plota

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