Sytuacja wygląda następująco: jest baza danych, która posiada wiele tabel. Baza ta przechowuje w dużym uproszczeniu projekty. Projekty te mają różne zadania. Zadania raportuje się co miesiąc. Raportowanie odbywa się na zasadzie przydzielania statusów dla danego zadania. Wygląda to mniej więcej tak:
Projekt 1:
- Zadanie 1 - zadanie realizowane zgodnie z harmonogramem
- Zadanie 2 - zadanie realizowane zgodnie z harmonogramem
- Zadanie 3 - zadanie realizowane zgodnie z harmonogramem
Projekt 2:
- Zadanie 1 - zadanie jest opóźnione
- Zadanie 2 - zadanie realizowane zgodnie z harmonogramem
- Zadanie 3 - zadanie jest opóźnione
Chciałem zrobić zapytanie, które będzie działało na zasadzie takiej, że jeśli choć jedno zadanie jest opóźnione, to cały projekt jest opóźniony. Czyli po realizacji zapytania chciałbym mieć taki wynik:
Projekt 1 - projekt odbywa się zgodnie z planem
Projekt 2 - projekt opóźniony
Zacząłem dłubać zapytanie, jednak za wiele z niego nie wyszło. Najpierw opis poszczególnych pól, żeby się połapać:
KP_krotkaNazwaProjektu - jak sama nazwa wskazuje, jest to krótka nazwa danego projektu, znajduje się w tabeli KP_KartyProjektow
P_numerPortfela - jest to tabela słownikowa, jest ona po prostu potrzebna do wybrania odpowiedniego portfela, znajduje się w tabeli SLO_Portfele
SP_nazwaSpolki - jest to tabela słownikowa, jest ona po prostu potrzebna do wybrania odpowiedniej spółki, znajduje się w tabeli SLO_Spolki
Realizacja kamienia milowego zagrożona - to jest to nasze opóźnienie z przykładu podanego wyżej
RAP_uwaga - jest to właśnie pole w tabeli RAP_PostepyKM, które przechowuje status danego zadania
Ewidencje - jest to tabela, która w zasadzie zastosowana jest tutaj tylko jako łącznik - co zresztą widać, że w zapytaniu zostało wykorzystane pole tylko z ID
RAP_Raporty - tabela, która znów służy głównie do łączenia zależności
Nazwy spółek są zamazane, ale przyjąłem zasadę, że jeżeli mamy np. kolor czerwony w miejscu danej spółki, to tyczy się on tej jednej spółki, inny kolor to inna spółka. Nazwy projektów są lekko ocenzurowane, ale widać, że wyników jest kilka - nie jeden.
Pierwsze zapytanie zwraca to, co jest załączone jako zdjęcie numer 1:
SELECT kp.KP_krotkaNazwaProjektu, p.P_nrPortfela AS [Numer portfela], s.SP_nazwaSpolki, IIf(rapp.RAP_uwaga = " Realizacja kamienia milowego zagrożona","Projekt zagrożony","Projekt niezagrożony") AS Status
FROM (((((SLO_Portfele AS p INNER JOIN KP_KartyProjektow AS kp ON p.ID_portfela=kp.ID_portfela) INNER JOIN SLO_Spolki AS s ON s.ID_spolki=kp.ID_spolki) INNER JOIN Ewidencje AS e ON e.ID_kartyProjektu = kp.ID_kartyProjektu) INNER JOIN RAP_Raporty AS rap ON rap.ID_ewidencji = e.ID_ewidencji) INNER JOIN RAP_PostepyKM AS rapp ON rapp.ID_raportu = rap.ID_raportu) INNER JOIN PZP_Zadania AS pzpz ON pzpz.ID_zadania = rapp.ID_zadania
Drugie zapytanie zwraca to, co jest załączone jako zdjęcie numer 2 - podzapytanie zwraca uwagi dla wszystkich projektów, a nie tak jakbym chciał - czyli dla każdego z osobna:
SELECT kp.KP_krotkaNazwaProjektu, p.P_nrPortfela AS [Numer portfela], s.SP_nazwaSpolki, IIf(" Realizacja kamienia milowego zagrożona" = ANY (SELECT rapp.RAP_uwaga FROM (((((SLO_Portfele AS p INNER JOIN KP_KartyProjektow AS kp ON p.ID_portfela=kp.ID_portfela) INNER JOIN SLO_Spolki AS s ON s.ID_spolki=kp.ID_spolki) INNER JOIN Ewidencje AS e ON e.ID_kartyProjektu = kp.ID_kartyProjektu) INNER JOIN RAP_Raporty AS rap ON rap.ID_ewidencji = e.ID_ewidencji) INNER JOIN RAP_PostepyKM AS rapp ON rapp.ID_raportu = rap.ID_raportu) INNER JOIN PZP_Zadania AS pzpz ON pzpz.ID_zadania = rapp.ID_zadania WHERE rapp.ID_zadania = pzpz.ID_zadania AND kp.KP_krotkaNazwaProjektu = kp.KP_krotkaNazwaProjektu),"Projekt zagrożony","Projekt niezagrożony") AS Status
FROM (((((SLO_Portfele AS p INNER JOIN KP_KartyProjektow AS kp ON p.ID_portfela=kp.ID_portfela) INNER JOIN SLO_Spolki AS s ON s.ID_spolki=kp.ID_spolki) INNER JOIN Ewidencje AS e ON e.ID_kartyProjektu = kp.ID_kartyProjektu) INNER JOIN RAP_Raporty AS rap ON rap.ID_ewidencji = e.ID_ewidencji) INNER JOIN RAP_PostepyKM AS rapp ON rapp.ID_raportu = rap.ID_raportu) INNER JOIN PZP_Zadania AS pzpz ON pzpz.ID_zadania = rapp.ID_zadania
Żaden z wyników mnie satysfakcjonuje, jak mogę poprawić rezultaty do przykładu z początku?