MS Access - problem z zapytaniem

Odpowiedz Nowy wątek
2019-09-04 09:32
0

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?

Pozostało 580 znaków

2019-09-04 09:56

Wybrać możesz tak:


SELECT
    rap.ID_ewidencji
    ,iif(count(rapp.RAP_uwaga)=0,"Projekt niezagrożony","Projekt zagrożony") Status
FROM
    RAP_Raporty AS rap
    LEFT JOIN RAP_PostepyKM AS rapp ON rapp.ID_raportu = rap.ID_raportu and rapp.RAP_uwaga = "                Realizacja kamienia milowego zagrożona"
group by
    rap.ID_ewidencji
@Panczo: Bardzo dziękuję za pomoc, miłego dzionka :). - Tomasz Papryka 2019-09-04 10:19

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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