błędne zapytanie - raport

0

Witajcie,

Mam 3 tabele:
sprzet: id_sprzetu, nazwa, indeks, JIM, ilosc
pomieszczenia: id_pomieszczenia, nr_pomieszczenia, opis
lok_sprzetu: id_l_s, id_sprzet, id_pom, iloscloksprzetu, uwagi

W tabeli sprzet mam informacje ile sprzętu i w jakiej ilości mam na stanie (obciążeniu).
W tabeli lok_sprzetu mam dane jaki sprzęt w jakiej ilości znajduje sie w danym pomieszczeniu.

Teraz chciałbym zbudowac zapytanie z którym mam problem, żeby porównac czy mam zgodnośc z ilością sprzetu z obciążenia (tabela sprzet) a tym co jest w pomieszczeniach.
Np: w tabeli sprzet mam 22 szt. komputerów na stanie a w pomieszczeniach: nr 12 - 1, nr 22 - 12. Lub jakieś ewentualne nadstany. Muszę zbudowac tabelę (php, html) w której bedą wyniki: braki, nadwyżka.

Jakiś czas temu miałem problem ze stworzeniem raportu - porównania o zgodności sprzetu bedącego na moim obciążeniu z tym co jest w pomieszczeniach. Po pewnym czasie dostrzegłem błąd iż w raporcie w kolumnie nazwa sprzętu nie są wszystkie dane z tabeli sprzęt a być powinny żeby je porównać z tym co jest w pomieszczeniach.

Coś nie tak z zapytaniem?

SELECT nazwa, ilosc, razem, COALESCE(ilosc,0)-COALESCE(razem,0) roznica FROM jos_sprzet s LEFT JOIN (SELECT id_sprzet, SUM( iloscloksprz ) razem FROM jos_lok_sprzetu GROUP BY 1 ) x ON s.id_sprzetu = x.id_sprzet WHERE razem <> s.ilosc

0

Wydaje się w porządku (na oko). Jeśli chcesz mieć wszystkie dane z tabeli sprzęt, usuń warunek "WHERE razem <> s.ilosc".

0

Może tak:

SELECT s.nazwa, s.ilosc, IFNULL(SUM(ls.iloscloksprz),0) w_pomieszczeniach, s.ilosc-IFNULL(SUM(ls.iloscloksprz),0) roznica FROM jos_sprzet s 
LEFT JOIN jos_lok_sprzetu ls ON s.id_sprzetu=ls.id_sprzet
GROUP BY s.id_sprzetu
HAVING roznica!=0
0

Niby jest OK. W tabeli sprzęt jest 104 pozycje a w wyniku zapytania pojawia się 100 - nie wiem dlaczego?

0

Wielkie dzięki! Działa :)

0

Próbuję dodać jeszcze jedną kolumnę do tabeli. Chciałbym aby była informacja na podstawie wyświetlanych informacji- "stan zgodny" lub "stan niezgodny" (przy różnicy). Kiedyś stosowałem switch case, ale w tabeli miałem dodatkowe pole id. Nie wiem za bardzo jak to ugryźć.

0

Hejka,
w mssql mozna to zrobic z cross apply (tylko zamiast funkcji uzyc podzapytania z twoimi warunkami) - z tego co widze w necie w mysql powinien outer apply rozwiazac twoj problem. Mozesz tez jako ostatnia kolumne wyswietlic kolumne z inner join i twoim case
pseudkod:
select t1.a, t1.b, t2.c
from blabla (as) t1
inner join (select a, (case itd) (as) c
from blabla ) t2
on t1.a = t2.a
where
group by

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