<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Problem z posortowaniem]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=1200</link>
		<description><![CDATA[Najświeższe odpowiedzi w Problem z posortowaniem.]]></description>
		<lastBuildDate>Fri, 27 Jan 2012 03:07:42 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Problem z posortowaniem]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3383#p3383</link>
			<description><![CDATA[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";]]></description>
			<author><![CDATA[dummy@example.com (Student)]]></author>
			<pubDate>Fri, 27 Jan 2012 03:07:42 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3383#p3383</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z posortowaniem]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3374#p3374</link>
			<description><![CDATA[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:

[code]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;[/code]

Można by użyć jeszcze w podobny sposób EXCEPT:

[code]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;[/code]]]></description>
			<author><![CDATA[dummy@example.com (gszpetkowski)]]></author>
			<pubDate>Tue, 24 Jan 2012 13:30:09 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3374#p3374</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z posortowaniem]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3372#p3372</link>
			<description><![CDATA[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";]]></description>
			<author><![CDATA[dummy@example.com (Student)]]></author>
			<pubDate>Mon, 23 Jan 2012 22:49:40 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3372#p3372</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z posortowaniem]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3366#p3366</link>
			<description><![CDATA[Dzięki ;) Nie znam składni i myślałem że group samo w sobie działa jako order]]></description>
			<author><![CDATA[dummy@example.com (Student)]]></author>
			<pubDate>Thu, 19 Jan 2012 15:00:13 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3366#p3366</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z posortowaniem]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3365#p3365</link>
			<description><![CDATA[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:

[code]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;[/code]

Przykładowy wynik:

[code] idAutor | ilosc
---------+-------
       1 |     4
       2 |     2
       3 |     1
(3 rows)[/code]]]></description>
			<author><![CDATA[dummy@example.com (gszpetkowski)]]></author>
			<pubDate>Thu, 19 Jan 2012 10:44:59 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3365#p3365</guid>
		</item>
		<item>
			<title><![CDATA[Problem z posortowaniem]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3363#p3363</link>
			<description><![CDATA[Witam, zacznę konkretnie [url=http://153.19.8.1/PG/projektsql.pdf]tu jest projekt encji mojej bazy danych[/url], trochę pokićkany ale mniej wiecej. Problem mam z uzyskaniem listy autorów posortowaną według liczby wypożyczeń ich książek. Ponieważ kosola zwraca "aggregates not allowed in GROUP BY clause" więc podejrzewam że nie można tak zrobić:
select projekt_1."Autor"."idAutor", projekt_1."Autor".imie, projekt_1."Autor".nazwisko, count(*) 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 ilosc, projekt_1."Autor"."idAutor";

W takim razie jak pogrupować to według kolumny zliczającej nie używając zliczania do grupowania? nie trzeba chyba picać całego skryptu żeby to posortować prawda?]]></description>
			<author><![CDATA[dummy@example.com (Student)]]></author>
			<pubDate>Thu, 19 Jan 2012 01:19:43 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3363#p3363</guid>
		</item>
	</channel>
</rss>
