Podzapytania - proste zadania

0

Witam,
Mam kolejne wątpliwości odnośnie pewnych zadań w ORACLE. Tylko że tym razem tych problemów jest więcej. Dotarłem do czwartego zadania z sześciu, dwa pierwsze łatwe, z kolejnymi dwoma jest problem.
A o to treść zadania czwartego:

Wyświetlić nazwisko, imię czytelnika, nazwę książki oraz karę (20 gr za każdy dzień) dla czytelników
przetrzymujących książki (jeżeli minęło więcej niż trzy miesiące od daty wypożyczenia).

Tutaj jest ta baza danych:

CREATE TABLE wydawnictwo(
    id_wydawnictwo NUMBER(10) CONSTRAINT wydawnictwo_pk PRIMARY KEY,
    nazwa VARCHAR2(20) CONSTRAINT wydawnictwo_nazwa_u UNIQUE,
    ulica VARCHAR2(30),
    nr_domu VARCHAR2(8),
    nr_lokalu VARCHAR2(4),
    kod_pocztowy VARCHAR2(6),
    poczta VARCHAR2(20)
)
/
--
CREATE TABLE ksiazka(
    id_ksiazka NUMBER(6) CONSTRAINT ksiazka_pk PRIMARY KEY,
    tytul VARCHAR2(30) CONSTRAINT ksiazka_tytul_nn NOT NULL
)
/
--
CREATE TABLE autor(
    id_autor NUMBER(6) CONSTRAINT autor_pk PRIMARY KEY,
    nazwisko VARCHAR2(20) CONSTRAINT autor_nazwisko_nn NOT NULL,
    imie VARCHAR2(20) CONSTRAINT autor_imie_nn NOT NULL
)
/
-- 
CREATE TABLE autor_ksiazki(
    waznosc NUMBER(2),
--  najwazniejszy autor ma waznosci o wartosci 1, kolejny 2, itd.
    id_ksiazka NUMBER(6) CONSTRAINT ak_ksiazka_fk REFERENCES ksiazka(id_ksiazka),
    id_autor NUMBER(6) CONSTRAINT ak_autor_fk REFERENCES autor(id_autor),
    CONSTRAINT ak_pk PRIMARY KEY (id_ksiazka, id_autor)
)
/
--
CREATE TABLE egzemplarz(
    id_egzemplarz NUMBER(6) CONSTRAINT egzemplarz_pk PRIMARY KEY,
    id_ksiazka NUMBER(6) CONSTRAINT egzemplarz_ksiazka_fk REFERENCES ksiazka(id_ksiazka),
    id_wydawnictwo NUMBER(6) CONSTRAINT egzemplarz_wydawnictwo_fk REFERENCES wydawnictwo(id_wydawnictwo),
--  informacja o wydaniu moze byc przedstawiona w postaci oddzielnej relacji
    rok_wydania NUMBER(4) CONSTRAINT egzemplarz_rok_wydania_nn NOT NULL,
--  stan = 0 oznacza, ze dany egzemplarz jest wypozyczony
--  stan = 1 oznacza, ze dany egzemplarz jest dostepny
--  informacje o stanie egzemplarza mozna takze uzyskac na podstawie wypozyczen
    stan NUMBER(1) DEFAULT 1 CONSTRAINT egzemplarz_stan_ck CHECK (stan = 0 OR stan = 1)
)
/
--
CREATE TABLE pracownik(
    id_pracownik NUMBER(6) CONSTRAINT pracownik_pk PRIMARY KEY,
    nazwisko VARCHAR2(20) CONSTRAINT pracownik_nazwisko_nn NOT NULL,
    imie VARCHAR2(20) CONSTRAINT pracownik_imie_nn NOT NULL,
    wynagrodzenie NUMBER(8,2) DEFAULT(10000),
--  wszystkie mozliwe stanowiska moga byc przechowywany w postaci oddzielnej relacji
    stanowisko VARCHAR2(20) DEFAULT 'Bibliotekarz'
)
/
--
CREATE TABLE faktura(
    id_faktura NUMBER(6) CONSTRAINT faktura_pk PRIMARY KEY,
    id_wydawnictwo NUMBER(10) CONSTRAINT faktura_wydawnictwo_fk REFERENCES wydawnictwo(id_wydawnictwo),
    id_pracownik NUMBER(6) CONSTRAINT faktura_pracownik_fk REFERENCES pracownik(id_pracownik),
    data date DEFAULT(sysdate)
--  faktura moze zawierac takze informacje o sumie
)
/
--
CREATE TABLE pozycja_faktury(
    id_pozycja_faktury NUMBER(4) CONSTRAINT pf_pk PRIMARY KEY,
--  jezeli jak klucz glowny zostaloby uzyte (id_faktura, id_ksiazka)
--  to na jednej fakturze moglibysmy miec tylko jedno wydanie danej ksiazki
    id_faktura NUMBER(6) CONSTRAINT pf_faktura_fk REFERENCES faktura(id_faktura),
    id_ksiazka NUMBER(6) CONSTRAINT pf_ksiazka_fk REFERENCES ksiazka(id_ksiazka),
    rok_wydania NUMBER(6) CONSTRAINT pf_rok_wydania_nn NOT NULL,
    ilosc NUMBER(6) CONSTRAINT pf_ilosc_nn NOT NULL,
    cena NUMBER(8,2) CONSTRAINT pf_cena_nn NOT NULL
)
/   
--
CREATE TABLE czytelnik(
    id_czytelnik NUMBER(10) CONSTRAINT czytelnik_pk PRIMARY KEY,
    nazwisko VARCHAR2(30) CONSTRAINT czytelnik_nazwisko_nn NOT NULL,
    imie VARCHAR2(30) CONSTRAINT czytelnik_imie_nn NOT NULL,
    ulica VARCHAR2(30),
    nr_domu VARCHAR2(8),
    nr_lokalu VARCHAR2(4),
    kod_pocztowy VARCHAR2(6),
    poczta VARCHAR2(20)
)
/
--
CREATE TABLE wypozyczenie(
    id_wypozyczenie NUMBER(10) CONSTRAINT wypozyczenie_pk PRIMARY KEY,
    id_czytelnik NUMBER(10) CONSTRAINT wypozyczenie_czytelnik_fk REFERENCES czytelnik(id_czytelnik),
    id_egzemplarz NUMBER(6) CONSTRAINT wypozyczenie_egzemplarz_fk REFERENCES egzemplarz(id_egzemplarz),
-- Pracownik wypozyczajacy ksiazke
    id_pracownik_wyp NUMBER(6) CONSTRAINT wypozyczenie_pracownik_wyp_fk REFERENCES pracownik(id_pracownik),
    data_wypozyczenia date DEFAULT(sysdate),
-- Pracownik przyjmujacy zwracana ksiazke
    id_pracownik_zwr NUMBER(6) CONSTRAINT wypozyczenie_pracownik_zwr_fk REFERENCES pracownik(id_pracownik),
    data_zwrotu date DEFAULT(NULL)
)
/

Do tej pory zrobiłem coś takiego:

SELECT czytelnik.nazwisko, czytelnik.imie, ksiazka.tytul, kara
FROM czytelnik, ksiazka, wypozyczenie, egzemplarz,  
(
  SELECT czytelnik.id_czytelnik, round(sysdate- wypozyczenie.data_wypozyczenia) kara
  FROM wypozyczenie , czytelnik
  WHERE wypozyczenie.id_czytelnik = czytelnik.id_czytelnik
  AND wypozyczenie.data_zwrotu IS NULL
  AND round(sysdate- wypozyczenie.data_wypozyczenia) > 90
)
WHERE wypozyczenie.id_czytelnik = czytelnik.id_czytelnik
AND wypozyczenie.id_egzemplarz = egzemplarz.id_egzemplarz
AND egzemplarz.id_ksiazka = ksiazka.id_ksiazka;

I tak. Samo podzapytanie zwraca prawidłową liczbę rekordów, wyświetla id czytelnika i liczbę dni, które książkę przetrzymuje.
Natomiast już w pełnym zapytaniu tych rekordów pojawia się osiem...

W międzyczasie, proszę o wskazówki odnośnie zadania trzeciego, tzn:

Wyświetlić informacje zawierające miesięczne zestawienie dla każdego wydawnictwa za okres ostatnich
kilku lat zawierające informacje o kwocie na jaką w każdym miesiącu zakupione zostały książki z każdego
wydawnictwa.

Z góry dziękuję za pomoc.

0

Te zadania udało mi się rozwiązać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1