1

Temat: pytania zagnieżdzone

hej, nie mogę sobie poradzić ze stworzeniem pytania:
Ile, procentowo, zamowien bylo dostarczanych do tego samego
      miasta, z ktorego byly zamawiane (w porownaniu z liczba
      wszystkich zamowien) w poszczegolnych latach.
na razie stworzylem wyswietlanie tych zamowien ktore spelniaja ten warunek tych samych miast

select rok,sum(ilosc_zamowien) as ilosc1 from h_sprzedazkwiatow
join h_klienci on h_klienci.nrklienta = h_sprzedazkwiatow.nrklienta
join h_czas on h_czas.nrczas = h_sprzedazkwiatow.nrczas
join h_odbiorcy on h_odbiorcy.nrodbiorcy = h_sprzedazkwiatow.nrodbiorcy
where h_klienci.miasto = h_odbiorcy.miasto
group by h_czas.rok
order by rok 
CREATE TABLE h_czas (
    nrczas serial not null PRIMARY KEY,
    dzien integer NULL,
    dzien_nazwa varchar(15) NULL,
    tydzien integer NULL,
    miesiac integer NULL,
    kwartal integer NULL,
    rok integer NULL
    );

CREATE TABLE h_klienci (
    nrklienta serial not null PRIMARY KEY,
    idklienta varchar(10) NOT NULL,
    nazwa varchar(40) NOT NULL,
    miasto varchar(40) NOT NULL,
    kod char(6) NOT NULL
    );

CREATE TABLE h_odbiorcy (
    nrodbiorcy serial not null  PRIMARY KEY,
    idodbiorcy integer NOT NULL,
    nazwa varchar(40) NOT NULL,
    miasto varchar(40) NOT NULL,
    kod char(6) NOT NULL
  );


CREATE TABLE h_sprzedazkwiatow (
    nrklienta integer NOT NULL,
    nrodbiorcy integer NOT NULL,
    nrkompozycji integer NOT NULL,
    nrczas integer NOT NULL,
    CONSTRAINT nrklienta FOREIGN KEY (nrklienta)
    REFERENCES h_klienci(nrklienta),
    CONSTRAINT nrodbiorcy FOREIGN KEY (nrodbiorcy)
    REFERENCES h_odbiorcy(nrodbiorcy),
    CONSTRAINT nrkompozycji FOREIGN KEY (nrkompozycji)
    REFERENCES h_kompozycje(nrkompozycji),
    CONSTRAINT h_nrczas FOREIGN KEY (nrczas)
    REFERENCES h_czas(nrczas),
    wartosc numeric(7,2) NOT NULL,
    ilosc_zamowien integer NOT NULL,
    CONSTRAINT pk_SprzedazkwiatowID PRIMARY KEY (nrklienta,nrodbiorcy,nrkompozycji,nrczas)
); 

nie wiem jak stworzyć zapytania by jeszcze pokazywało mi łączną ilosc zamowien w roku a w nastepnej kolumnie procent
z góry dzięki za każdą pomoc

2

Odp: pytania zagnieżdzone

Zamiast wstawiać warunek do sekcji Where możesz zastosować "sumowanie warunkowe":

Select
    rok,
    sum(Case When h_klienci.miasto = h_odbiorcy.miasto Then ilosc_zamowien Else 0 End)
    *100.0/sum(ilosc_zamowien) As ilosc1
From
    h_sprzedazkwiatow
    Join h_klienci Using (nrklienta)
    Join h_czas Using (nrczas)
    Join h_odbiorcy Using (nrodbiorcy)
Group By rok
Order By rok;

Jeżeli kolumny przy złączeniach mają takie same nazwy, to można użyć Using podając nazwę tejże kolumny, nota bene wtedy utworzona tabela pochodna (ang. derived table) będzie posiadać jedną kolumnę wspólną, zamiast dwóch (jak przy On, który może przedstawiać różne warunki, nie tylko równość jak przy Using).

Przykładowy wynik:

 rok  |       ilosc1
------+---------------------
 2010 | 56.8181818181818182
 2011 | 26.4150943396226415
(2 rows)

Nie powinno być większego problemu z uzyskaniem wyniku np. zaokrąglonego do dwóch cyfr po przecinku vide odpowiednia funkcja postgresowa, ew. inne rzutowanie.

Ostatnio edytowany przez gszpetkowski (2012-01-17 21:22:05)

3

Odp: pytania zagnieżdzone

Jesteś wielki:) dzięki za lekcje, właśnie o to chodziło