1

Temat: Problem z zadaniami

Mam podane dwie tabele i trzy zadania do nich. Próbowałem coś wymyślić, ale nie są to dobre rozwiązania:P Prosze o podanie poprawnych rozwiązań. Z góry dziękuję:)


DROP TABLE osoba2;
DROP TABLE wyplata2;

CREATE TABLE osoba2 (
    id_osoba        INT     NOT NULL,
    imie            VARCHAR(20) NOT NULL,
    nazwisko        VARCHAR(20) NOT NULL,
    data_ur         DATE,
    PRIMARY KEY (id_osoba));

INSERT INTO osoba2 VALUES (1, 'Jan', 'Kowalski','1971-09-18');
INSERT INTO osoba2 VALUES (2, 'Jerzy', 'Nowak','1973-11-07');
INSERT INTO osoba2 VALUES (3, 'Jakub', 'Kargul','1981-01-13');
INSERT INTO osoba2 VALUES (4, 'Anna', 'Pawlak','1975-12-19');
INSERT INTO osoba2 VALUES (5, 'Henryk', 'Majewski','1975-05-19');


CREATE TABLE wyplata2 (
    id_wyplata      INT     NOT NULL,
    id_osoba        INT     NOT NULL,
    kwota           INT  NOT NULL,
    tytulem         VARCHAR(25) NOT NULL,
    data_wplaty     DATE,
    PRIMARY KEY (id_wyplata));
   
   
INSERT INTO wyplata2 VALUES (1,1,3100,'wyplata styczen 2009','2009-01-10');
INSERT INTO wyplata2 VALUES (2,1,3100,'wyplata luty 2009','2009-02-10');
INSERT INTO wyplata2 VALUES (3,1,3100,'wyplata marzec 2009','2009-03-10');
INSERT INTO wyplata2 VALUES (4,1,3100,'wyplata kwiecien 2009','2009-04-10');
INSERT INTO wyplata2 VALUES (5,1,3100,'wyplata maj 2009','2009-05-10');
INSERT INTO wyplata2 VALUES (6,1,3100,'wyplata czerwiec 2009','2009-06-09');
INSERT INTO wyplata2 VALUES (7,2,4500,'wyplata styczen 2009','2009-01-10');
INSERT INTO wyplata2 VALUES (8,2,4500,'wyplata luty 2009','2009-02-10');
INSERT INTO wyplata2 VALUES (9,2,1000,'wyplata luty 2009','2009-02-15');
INSERT INTO wyplata2 VALUES (10,3,9100,'wyplata styczen 2009','2009-01-10');


--Zad A1
--Wyswietlic alfabetycznie osoby (nazwiska i imiona), które urodzily sie w
--miesiacu maju i nie otrzymaly dotad zadnej wyplaty.

SELECT o.imie, o.nazwisko
FROM osoba2 o JOIN wyplata2 w
ON o.id_osoba=w.id_osoba
WHERE date_part('month', TIMESTAMP data_ur)=5 AND id_wyplata IS NULL
ORDER BY o.nazwisko ASC, o.imie ASC;


--Zad A2
--Dla kazdej osoby znalezc laczna sume wyplat, o ile nie bylo dla tej osoby
--wiecej niz 5 wyplat. (Dla osob, ktore nie otrzymaly zadnej wyplaty taka
--suma powinna wynosic zero.)

SELECT o.imie, o.nazwisko, SUM(w.kwota)
FROM osoba2 o JOIN wyplata2 w
ON o.id_osoba=w.id_osoba
ORDER BY o.nazwisko ASC, o.imie ASC
HAVING COUNT(w.id_osoba) < 5;

--Zad A3
--Wyszukac osoby, ktore choc w jednym miesiacu otrzymaly wiecej niz jedna wyplate.

2

Odp: Problem z zadaniami

No ale żeby zadania domowe wrzucać na forum ... ach ta młodzież
AD 1.
Użyj warunku któy mówi że id_osoby nie występuje (NOT IN) w tabeli wypłaty

AD2.
No tego chyba nie przemyślałeś. Gdzie jest GROUP BY?
Najpierw wymyśl zapytanie, które wybierze osoby które nie miały więcej niż 5 wypłat.
Potem wstaw tego SELECT'a do warunku WHERE.

AD3.
W jednym miesiącu tego samego roku?

I UCZ SIĘ smile !!

3

Odp: Problem z zadaniami

Zadanie 2 Rozwiązałem tak :

SELECT o.imie, o.nazwisko, SUM(w.kwota)
FROM osoba2 o, wyplata2 w
WHERE o.id_osoba=w.id_osoba
GROUP BY o.id_osoba, o.nazwisko, o.imie
HAVING COUNT(w.id_osoba) < 6;

i robiłem je na podstawie przykładu 1-7 z Tutoriala, wiec myślę, że jest poprawnie rozwiązane.

Z zadaniem 1 kombinowałem tak:

SELECT o.imie, o.nazwisko
FROM osoba2 o JOIN wyplata2 w
ON o.id_osoba=w.id_osoba
WHERE id_wyplata IS NULL
GROUP BY w.id_osoba, o.nazwisko, o.imie, o.data_ur
HAVING date_part('month', data_ur)=5
ORDER BY o.nazwisko ASC, o.imie ASC;

i tutaj dalej jest źle:P

Jeśli ktoś jest w stanie mi pomoc to proszę o konkretniejsze podpowiedzi, bo nie jest łatwo.

P.S. To nie jest zadanie domowe- bynajmniej nie moje:)

4

Odp: Problem z zadaniami

AD 2.
A co z osobami które nie otrzymały wypłaty, wyświetla ci zero?

AD 1.
Chyba bardzo lubisz GROUP BY smile.
To może tak

SELECT o.imie, o.nazwisko
FROM osoba2 o
WHERE date_part('month', TIMESTAMP data_ur)=5 AND 
o.id_osoba NOT INT (SELECT id_osoba FROM wyplaty)
ORDER BY o.nazwisko ASC, o.imie ASC;

AD 3.
Zadałem pytanie, czy "jednym miesiacu otrzymaly wiecej niz jedna wyplate".
oznacza w jednym miesiącu tego samego roku?

5

Odp: Problem z zadaniami

Dziękuję bardzo za pomoc:) W zadaniu trzecim-w jednym miesiącu tego samego roku, tak mi się wydaje, bo to by pasowało do danych z tabeli( wszystkie wypłaty z 2009).

6

Odp: Problem z zadaniami

Zadanie 3. jest podobne do 1.
Wystarczy tylko zmienić NOT IN na IN i zmienić zapytanie zagnieżdżone tak aby zwracało id pracowników którzy dostali co najmniej dwie wypłaty w jednym miesiącu (grupowanie po id_pracownika i miesiącu a miesąc wyciągniesz z daty za pomocą date_part)