Problem z SQL

MgielkaCuba
Użytkownik
Użytkownik
Posty: 273
Rejestracja: 18 paź 2007, o 21:35
Płeć: Kobieta
Lokalizacja: Wrocław
Podziękował: 22 razy

Problem z SQL

Post autor: MgielkaCuba » 5 lip 2010, o 22:53

Bardzo proszę o sprawdzenie i ewentualne korekty. Będę bardzo wdzięczna.
2 tabelki:
Producent(REGON,nazwa,adres)
Produkt(kod,REGON,rodzaj,nazwa,moc,cena)

Napisz polecenie SQL, które zwróci rodzaj produktu oraz nazwe producenta, nazwe produktu, dla którego iloczyn mocy
i ceny jest mniejsza od 1/2 sredniej wartosci tego iloczynu dla danego rodzaju produktu

SELECT produkt.rodzaj, producent.nazwa, produkt.nazwa,(AVG(produkt.moc/produkt.cena))/2 as iloczyn

FROM Produkt JOIN Producent ON (Produkt.REGON=Producent.REGON)

GROUP BY produkt.nazwa

HAVING AVG(produkt.moc/produkt.cena)>= ALL

(SELECT (produkt.moc/produkt.cena)
FROM Produkt
GROUP BY produkt.nazwa )

pfauel
Użytkownik
Użytkownik
Posty: 32
Rejestracja: 26 lis 2009, o 01:15
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 9 razy

Problem z SQL

Post autor: pfauel » 6 lip 2010, o 00:33

Witam, niestety Twój kod z tego co mi się wydaje, jest całkowicie błędny - chyba, że źle zrozumiałem polecenie. Napisałem Tobie, jak mi się wydaję, że to powinno wyglądać:

Kod: Zaznacz cały

SELECT a.nazwa AS NAZWA_PRODUKTU, 
a.rodzaj AS RODZAJ_PRODUKTU, 
p.nazwa AS NAZWA_PRODUCENTA, a.iloczyn AS ILOCZYN
FROM 
(SELECT p.regon AS regon, p.nazwa AS nazwa, p.rodzaj AS rodzaj, p.moc*p.cena AS iloczyn FROM Produkt p) a, 
(SELECT p.rodzaj AS rodzaj, avg(p.moc*p.cena) AS iloczyn FROM Produkt p GROUP BY p.rodzaj) b,
Producent p
WHERE a.rodzaj = b.rodzaj
AND a.iloczyn <= b.iloczyn/2
AND p.regon = a.regon
Nie rozumiem, dlaczego u siebie w kodzie próbujesz grupować nazwy produktów - w poleceniu tego nie ma, więc tego nie wpisałem. I jeszcze jedno, co mnie zastanawia: w poleceniu piszesz "iloczyn", ale u siebie w kodzie, cały czas obliczasz stosunek mocy do ceny (iloraz) - które jest prawidłowe? Jeśli ma być iloraz to myślę, że bez problemu znajdziesz dwa miejsca u mnie w kodzie, gdzie musisz zmienić * na /, jeśli iloczyn to nie musisz już nic zmieniać u mnie - wszystko jest dobrze. Mam nadzieję, że pomogłem. Jeśli masz jakieś pytania do mojego kodu to pytaj śmiało.
pozdrawiam

MgielkaCuba
Użytkownik
Użytkownik
Posty: 273
Rejestracja: 18 paź 2007, o 21:35
Płeć: Kobieta
Lokalizacja: Wrocław
Podziękował: 22 razy

Problem z SQL

Post autor: MgielkaCuba » 6 lip 2010, o 10:36

Dziękuję za pomoc, jednak ja nie rozumiem składni. My na zajęciach nie używaliśmy komendy AS, ani po FROM nie używaliśmy SELECT. Czy można to zapisać inaczej?

pfauel
Użytkownik
Użytkownik
Posty: 32
Rejestracja: 26 lis 2009, o 01:15
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 9 razy

Problem z SQL

Post autor: pfauel » 6 lip 2010, o 16:43

SQL ma to do siebie, że na ogół istnieje więcej możliwości uzyskania tego samego wyniku (choć wtedy, mimo takiego samego wyniku, jedne rozwiązania mogą działać szybciej, inne wolniej).
Napisałem inne rozwiązanie, może bardziej się Tobie spodoba:

Kod: Zaznacz cały

SELECT a.nazwa AS NAZWA_PRODUKTU, 
a.rodzaj AS RODZAJ_PRODUKTU, 
p.nazwa AS NAZWA_PRODUCENTA, a.moc*a.cena AS ILOCZYN
FROM Produkt a, Producent p
WHERE a.moc*a.cena <= (SELECT AVG(x.moc*x.cena)/2 FROM Produkt x WHERE a.rodzaj = x.rodzaj GROUP BY x.rodzaj)
AND p.regon = a.regon
AS używam tutaj tylko po to, żeby nazwy kolumn były na koniec ładniejsze. To bardzo podstawowy operator. SELECTy "wewnątrz" kodu, czyli tzw. "subquery" też są bardzo podstawową i ułatwiającą życie sprawą. Polecam zapoznać się - napewno się przyda.
pozdrawiam

MgielkaCuba
Użytkownik
Użytkownik
Posty: 273
Rejestracja: 18 paź 2007, o 21:35
Płeć: Kobieta
Lokalizacja: Wrocław
Podziękował: 22 razy

Problem z SQL

Post autor: MgielkaCuba » 6 lip 2010, o 20:00

Dziękuje

ODPOWIEDZ