1

Temat: Problem z posortowaniem

2

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)

3

Odp: Problem z posortowaniem

Dzięki wink Nie znam składni i myślałem że group samo w sobie działa jako order

4

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 smile 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";

5

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)

6

Odp: Problem z posortowaniem

Dzięki za wszystko smile 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";