Odp: Problem z posortowaniem
Takie zapytanie nie miało prawa zadziałać, gdyż zawarłeś ilosc (alias na count(*)) w grupowaniu, które nie może zawierać funkcji agregujących, od tego jest choćby klauzula Having, czy też lista przy Select. Sądzę, że chodziło Ci o coś takiego:
Select
projekt_1."Autor"."idAutor",
count(projekt_1."Wypozyczenie"."idWypozyczenie") As ilosc
From
projekt_1."Wypozyczenie",
projekt_1."Autor",
projekt_1."Autorzy"
Where
projekt_1."Wypozyczenie"."Ksiazka_idKsiazka" = projekt_1."Autorzy"."Ksiazka_idKsiazka"
And projekt_1."Autorzy"."Autor_idAutor" = projekt_1."Autor"."idAutor"
Group By
projekt_1."Autor"."idAutor"
Order by ilosc Desc;
Przykładowy wynik:
idAutor | ilosc
---------+-------
1 | 4
2 | 2
3 | 1
(3 rows)
Odp: Problem z posortowaniem
Dzięki Nie znam składni i myślałem że group samo w sobie działa jako order
Odp: Problem z posortowaniem
Przepraszam że odświeżę ale mam problem z zapytaniem do tej samej bazy danych. Dostałem na zaliczenie egzaminu turbo wysublimowane zadanie, nie mam już pomysłów. Wypisać nazwy wydawnictw dla których książek nie ma wypożyczeń. Udało mi się wypisać id wydawnictw dla których są jakiekolwiek wypożyczenia, ale nie mam w ogóle pomysłu co dalej i czy w dobrym kierunku idę. Jak by ktoś by mi podpowiedział czy tak się da to zrobić i jaka funkcja była by przydatna byłbym wdzięczny PS zrobił bym to countem ale gdy jest 0 to count nic nie zwraca albo nie rozumiem co zwraca ;/
select
projekt_1."Ksiazka"."Wydawnictwo_idWydawnictwo" as nazwa_wydawnictwa
from
projekt_1."Wydawnictwo",
projekt_1."Ksiazka"
right join
projekt_1."Wypozyczenie"
on
projekt_1."Wypozyczenie"."Ksiazka_idKsiazka" = projekt_1."Ksiazka"."idKsiazka"
group by
nazwa_wydawnictwa order by projekt_1."Ksiazka"."Wydawnictwo_idWydawnictwo";
Odp: Problem z posortowaniem
Moim zdaniem może nie będzie to najbardziej optymalne podejście, ale najłatwiej jest wyszukać wszystkie id'ki wydawnictw, które już maja wypożyczenia (mogą się powtarzać, dlatego warto użyć DISTINCT, szczególnie dla większych ilosci danych może dać spory speedup), a następnie użyć konstrukcji NOT IN otrzymując pozostałe, dodatkowo można to ująć w CTE oddzielając obydwa kroki od siebie:
With "WydawnictwoWyp" As (
Select Distinct "Wydawnictwo_idWydawnictwo"
From projekt_1."Ksiazka" k Inner Join projekt_1."Wypozyczenie" w
On k."idKsiazka" = w."Ksiazka_idKsiazka"
)
Select "idWydawnictwo", nazwa
From projekt_1."Wydawnictwo"
Where "idWydawnictwo" Not In (Select "Wydawnictwo_idWydawnictwo" From "WydawnictwoWyp")
Order By nazwa;
Można by użyć jeszcze w podobny sposób EXCEPT:
Select "idWydawnictwo", nazwa From projekt_1."Wydawnictwo"
Inner Join
(Select "idWydawnictwo" From projekt_1."Wydawnictwo"
Except
Select Distinct "Wydawnictwo_idWydawnictwo"
From projekt_1."Ksiazka" k Inner Join projekt_1."Wypozyczenie" w
On k."idKsiazka" = w."Ksiazka_idKsiazka") s Using ("idWydawnictwo")
Order By nazwa;
Ostatnio edytowany przez gszpetkowski (2012-01-24 15:59:50)
Odp: Problem z posortowaniem
Dzięki za wszystko Problem polegał na tym że się musiałem wykorzystać warunek "idWydawnictwo"!="Wydawnictwo_idWydawnictwo". Zrobiłem to w końcu w ten sposób:
Select distinct
0,
nazwa
From
projekt_1."Wydawnictwo",
projekt_1."Ksiazka"
where
"idWydawnictwo" Not In (
Select distinct
"Wydawnictwo_idWydawnictwo"
From
projekt_1."Wypozyczenie",
projekt_1."Ksiazka"
where
"Wypozyczenie"."Ksiazka_idKsiazka"="Ksiazka"."idKsiazka"
) and
"idWydawnictwo"!="Wydawnictwo_idWydawnictwo";