Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Operacje na funkcjach agregujących - błędny wynik
Forum PHP.pl > Forum > Bazy danych
poison.Pluto
Mimo, że raczej jestem obserwatorem na forum, tym razem napotkałem na problem, z którym nie umiem dać sobie rady.

W dużym skrócie - mamy 2 tabele:

produkty:
| ID | ilosc | warosc |

rozchody:
| ID | ID_produktu | ilosc | data |

Teraz chciałbym policzyć stan magazynu czyli produkty, których suma rozchodów jest mniejsza niż ilość początkowa.
  1. SELECT p.ilosc, SUM( r.ilosc ) AS "Rozchód", SUM( p.ilosc ) / COUNT( p.ilosc ) AS "SUMA", SUM( p.ilosc ) / COUNT( p.ilosc ) - SUM( r.ilosc ) AS "Stan obecny"
  2. FROM { OJ rozchody r RIGHT OUTER JOIN produkty p ON r.ID_produktu = p.ID }
  3. GROUP BY p.ilosc


Teraz wyniki -
Rozchód pokazuje ok, dla produktów które nie mają rozchodów jest 0 (right join)
SUMA ok - wartość taka sama jak dla ilosc
Stan obecny - tutaj pojawia się problem, mianowicie dla produktów które mają rozchody liczy dobrze, ale dla tych które rozchodów nie mają pokazuje 0. Dlaczego tak się dzieje? Jak zrobić, żeby było dobrze?

Dzięki za pomoc!
maly_swd
funkcje agregujace sa wrazliwe na wartosci NULL... poadj jakies przykladowe dane na ktorych Ci to zle liczyi poadj co powinno wyjsc... to pomozemy:)

xdev
Na moje oko to najpierw powinieneś zmenić group by z p.ilosc na p.id...

to co masz obecnie pokaże tylko jeden produkt którego będziesz miał taką samą ilość, eg.
masz 3 jabłka i 3 ogórki to zobaczysz jedynie informacje o jabłkach w dodatku zmiksowaną z informacją o rozchodzie ogórków

SELECT produkty.id as produkt, produkty.ilosc - IF(SUM(rozchody.ilosc) IS NULL, 0, SUM(rozchody.ilosc)) as stan
FROM produkty
LEFT OUTER JOIN rozchody
ON produkty.id = rozchody.id_produktu
GROUP BY produkty.id


Przy FK powinieneś mieć raczej formę tabela_pole, czyli produkt_id (proiściej po miesiącu się czyta). Tak samo wszystkie tabele w liczbie pojedynczej (a nie mnogiej), to akurat jeśli masz więcej tabel - prościej się pisze smile.gif

0 - dlatego, że coś - NULL = NULL, dziwne, że widzisz tam 0 a nie po prostu NULL.
poison.Pluto
maly_swd, dzięki za zainteresowanie, już podaję smile.gif

produkty:
Kod
| ID | ilosc |
---------------
1     | 100
2     | 10


rozchody:
Kod
| ID | ID_produktu | ilosc |
----------------------------------
1     | 1                 | 10
2     | 1                 | 10

Teraz wyniki powyższego zapytania:
Kod
| ilosc | SUMA | Rozchód | Stan obecny |
------------------------------------------------
   100 |  100   | 20          |  80              |
   10   |  10    | 0            |   0               |

Problem jak widać jest w stanie obecnym dla produktu który nie ma rozchodu. Może jakoś inaczej skonstruować zapytanie? Szczerze, to nie mam pomysłu :/

edit:
xdev - zapytanie jest trochę bardziej skomplikowane, tutaj przedstawiam tylko wersję poglądową wink.gif tak żeby zobaczyć problem.

Napisałeś bardzo cenną rzecz -
Cytat
0 - dlatego, że coś - NULL = NULL, dziwne, że widzisz tam 0 a nie po prostu NULL.
- uświadomiło mi to, że faktycznie tutaj się posługujemy NULLami a nie zerami.

Twoje zapytanie wygląda super, tylko z tego co widzę to w HSQL nie ma instrukcji warunkowych ( http://hsqldb.org/doc/guide/ch09.html )... Da się to jakoś inaczej zrobić?
--
mogę połączyć 2 zapytania, w jednym pobrać te produkty które mają rozchody, w drugim te bez i wyjdzie dobrze, jednak podejrzewam, że da się to zrobić fajniej...
xdev
Może IFNULL albo CASEWHEN?

IFNULL(exp,value)
if exp is null, value is returned else exp
poison.Pluto
IFNULL działa super. Tego było mi trzeba. Dzięki! Lkingsmiley.png
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.