Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Suma kosztow
beeper
post 19.07.2005, 22:56:41
Post #1





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 20.01.2005

Ostrzeżenie: (0%)
-----


Potrzebuje zrobic zestawnienie kosztow
Ma sie wyswietlic dane o umowie i suma kosztow dla kazdej z nich

Sa 3 tabele:
Umowa
KosztyFin
KosztySad

i robie tak:
  1. SELECT w IDumowy
  2. , w.WNazwaSkrocona
  3. , w.DNazwaSkrocona
  4. , sum(wf.Kwota) AS SumKwotaFin , sum(ws.Kwota) AS SumKwotaSad
  5. FROM Umowa w
  6. LEFT JOIN KosztyFin wf ON w.IDumowy=wf.IDumowy
  7. LEFT JOIN KosztySad ws ON w.IDumowy=ws.IDumowy
  8. GROUP BY w.IDumowy

Niestety zle mi wylicza, kosztyFin wynosza 4012 a wylicza mi ze 170129,95

Nie mam pojecia skad sie to bierze.

Porszę o pomoc.

Ten post edytował beeper 19.07.2005, 22:57:33
Go to the top of the page
+Quote Post
Jabol
post 19.07.2005, 23:04:02
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


hmm... a sprawdzałeś obiawy? Skąd się bierze liczba 17.....cośtam? Czego jest sumą (wszystkich umów, czy jak?). Wylicza źle dla każdej umowy czy tylko dla jednej?
Go to the top of the page
+Quote Post
beeper
post 19.07.2005, 23:08:14
Post #3





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 20.01.2005

Ostrzeżenie: (0%)
-----


Sprawdzalem i w bazie wszystko wyglada wporzadku, nie wiem czemu to zle liczy dla wszystkich rekordow, inne sumy tez zle

Jeżeli robię np:
  1. SELECT sum(Kwota)
  2. FROM kosztyf<span style='color:green'>in WHERE ID=3

to wynik jest poprawny

Zauwazylem ze jesli lacze wylaczenie dwie tabele to wynik sum jest poprawny, jezeli dodaje następne to wplywa to na wynik, nie za bardzo to rozumiem

Ten post edytował beeper 20.07.2005, 07:58:11
Go to the top of the page
+Quote Post
nospor
post 20.07.2005, 08:34:39
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




left join ma to do siebie, że dołącza ci też full pustych rekordów, przez co tworzą się sztuczne rekordy do sumowania. Stąd ten przyrost.

musisz dać pare warunków na not null. Coś w tym stylu (zakładam ze masz pole ID w tabelach) (to powinno zmniejszyc sume, ale nie gwarantuje że da wynik poprawny)

  1. SELECT w IDumowy
  2. , w.WNazwaSkrocona
  3. , w.DNazwaSkrocona
  4. , sum(wf.Kwota) AS SumKwotaFin , sum(ws.Kwota) AS SumKwotaSad
  5. FROM Umowa w
  6. LEFT JOIN KosztyFin wf ON w.IDumowy=wf.IDumowy
  7. LEFT JOIN KosztySad ws ON w.IDumowy=ws.IDumowy
  8. WHERE wf.ID IS NOT NULL AND ws.ID IS NOT NULL
  9. GROUP BY w.IDumowy


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
beeper
post 20.07.2005, 08:45:22
Post #5





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 20.01.2005

Ostrzeżenie: (0%)
-----


Niestety nie dziala :/
Probowalem na innej bazie i działanie jest podobne :/
Mam takie zapytanie, które działa poprawnie
  1. SELECT w.IDwierzyciela
  2. , w.NaleznoscGlowna
  3. , sum(wp.wplatykwota)
  4. , sum(wf.kwota)
  5. , sum(ww.kwota)
  6. FROM windykacja w
  7. LEFT OUTER JOIN wplaty wp USING(IDwierzyciela)
  8. LEFT OUTER JOIN kosztywf wf USING(IDwierzyciela)
  9. GROUP BY w.IDwierzyciela


Ale w momencie kiedy dodaje jeszcze jedno zlaczenie, wynik jest znowu nieprawidlowy :/
  1. SELECT w.IDwierzyciela
  2. , w.NaleznoscGlowna
  3. , sum(wp.wplatykwota)
  4. , sum(wf.kwota)
  5. , sum(ww.kwota)
  6. FROM windykacja w
  7. LEFT OUTER JOIN wplaty wp USING(IDwierzyciela)
  8. LEFT OUTER JOIN kosztywf wf USING(IDwierzyciela)
  9. LEFT OUTER JOIN kosztyww ww USING(IDwierzyciela)
  10. GROUP BY w.IDwierzyciela
Go to the top of the page
+Quote Post
SongoQ
post 20.07.2005, 09:37:50
Post #6





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Moze idz tropem @nospor i daj konwersje z NULL na 0 w sumowaniu
sum(null_na_0 (wp.wplatykwota)) - wstaw funkcje odpowiednia do danej bazy bo nie zauwazylem do jakiej bazki sie Twoje zapytanie odnosi.


A jesli nie zadziala wrzuc strukture napisz jaka baza i podaj kilka rekordow.


--------------------
Go to the top of the page
+Quote Post
beeper
post 20.07.2005, 11:08:42
Post #7





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 20.01.2005

Ostrzeżenie: (0%)
-----


Tak wyglada diagram tabel ktore mnie interesuja

Jezeli robie osobno dla kosztowwf i ww
  1. SELECT Idwierzyciela, sum(kwota)
  2. FROM kosztywf GROUP BY idwierzyciela

Wynik jest poprawny i wyglada tak


To samo dla wplat
  1. SELECT Idwierzyciela, sum(wplatykwota)
  2. FROM wplaty GROUP BY idwierzyciela



Jezeli zrobie tak:
  1. SELECT w.IDwierzyciela
  2. , w.NaleznoscGlowna
  3. , sum(wp.wplatykwota)
  4. , sum(wf.kwota)
  5. FROM windykacja w
  6. LEFT OUTER JOIN wplaty wp USING(IDwierzyciela)
  7. LEFT OUTER JOIN kosztywf wf USING(IDwierzyciela)
  8. GROUP BY w.IDwierzyciela

to wszystko gra i dobrze liczy


Ale jak dodam kolejna tabele to juz sie sypie
  1. SELECT w.IDwierzyciela
  2. , w.NaleznoscGlowna
  3. , sum(wp.wplatykwota)
  4. , sum(wf.kwota)
  5. , sum(ww.kwota)
  6. FROM windykacja w
  7. LEFT OUTER JOIN wplaty wp USING(IDwierzyciela)
  8. LEFT OUTER JOIN kosztywf wf USING(IDwierzyciela)
  9. LEFT OUTER JOIN kosztyww ww USING(IDwierzyciela)
  10. GROUP BY w.IDwierzyciela


Go to the top of the page
+Quote Post
SongoQ
post 20.07.2005, 11:18:03
Post #8





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Moze jakis blad jest z using. Sprawdz przez LEFT JOIN i warunek zlaczenia w ON. Moze cos pomoze.

Mozesz tez sprawdzic jakie rekordy chce Ci sumowac dla id = 3, wywal grupowanie i sprawdz, bo skas ten blad musi byc.


--------------------
Go to the top of the page
+Quote Post
beeper
post 20.07.2005, 13:25:44
Post #9





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 20.01.2005

Ostrzeżenie: (0%)
-----


Z tego co dzis probowalem to wyglada na to ze mysql sobie cos nie radzi z laczeniem wielu tabel.
Go to the top of the page
+Quote Post
SongoQ
post 20.07.2005, 13:34:51
Post #10





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Sprawdzales tak jak Ci pisalem, 3 tabele przez LEFT JOIN i warunek w ON zobacz czy zadziala.

A bez grupowania robi Ci jakies wielokrotnosci? Czy laczy jakies niepozadane rekordy czy co?? Jakas przyczyna musi byc.


--------------------
Go to the top of the page
+Quote Post
beeper
post 20.07.2005, 13:42:55
Post #11





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 20.01.2005

Ostrzeżenie: (0%)
-----


Przez ON juz probowalem, efekt taki sam.
Nie mam pojecia czemu tak sie dzieje, zawsze jak dorzucam 3 tabele to sie sypie.
Bez grupowania nie pojdzie bo wywala blad
"Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause"


Zauwazylem ze wszystkie inne kolumny sa mnożone x4 razy za wyjatkiem kolumny koszty z tabeli kosztyww.
Zaczalem z generatorow kozystac, wiec nie wiem co moze byc zle. Dane w bazie? ale jak ?

Wg mnie to zapytanie powinno poprawnie dzialac, ale gdzie jest blad to nie wiem
  1. SELECT
  2. windykacja.IDwierzyciela,
  3. SUM(kosztywf.Kwota) AS KwotaWF,
  4. SUM(kosztyww.Kwota) AS KwotaWW,
  5. SUM(wplaty.WplatyKwota) AS KwotaWplaty
  6. FROM windykacja LEFT OUTER JOIN kosztywf ON (windykacja.IDwierzyciela=kosztywf.IDwierzyciela)
  7. LEFT OUTER JOIN kosztyww ON (windykacja.IDwierzyciela=kosztyww.IDwierzyciela)
  8. LEFT OUTER JOIN wplaty ON (windykacja.IDwierzyciela=wplaty.IDwierzyciela)
  9. GROUP BY windykacja.IDwierzyciela


Ten post edytował beeper 20.07.2005, 14:08:54
Go to the top of the page
+Quote Post
SongoQ
post 20.07.2005, 14:35:01
Post #12





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


  1. SELECT
  2. windykacja.IDwierzyciela,
  3. kosztywf.Kwota AS KwotaWF,
  4. kosztyww.Kwota AS KwotaWW,
  5. wplaty.WplatyKwota AS KwotaWplaty
  6. FROM windykacja LEFT JOIN kosztywf ON (windykacja.IDwierzyciela=kosztywf.IDwierzyciela)
  7. LEFT JOIN kosztyww ON (windykacja.IDwierzyciela=kosztyww.IDwierzyciela)
  8. LEFT JOIN wplaty ON (windykacja.IDwierzyciela=wplaty.IDwierzyciela)
  9. WHERE windykacja.IDwierzyciela = 3


Sprawdz co to Ci zwroci, czy jak zsumujesz recznie to bedzie ok?


--------------------
Go to the top of the page
+Quote Post
beeper
post 20.07.2005, 14:50:29
Post #13





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 20.01.2005

Ostrzeżenie: (0%)
-----


No teraz jest ok.


A tutaj wartosci na ktore sie to sklada


Widac ze w grupowaniu sie to wysypuje, nie mam pojecia jak to teraz zrobic
Go to the top of the page
+Quote Post
SongoQ
post 20.07.2005, 14:55:11
Post #14





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


A nie pisze nic na stronie MySQLa, ze w tej wersji i w tym jest blad??

Dziwne troszeczke sad.gif


--------------------
Go to the top of the page
+Quote Post
beeper
post 20.07.2005, 15:31:56
Post #15





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 20.01.2005

Ostrzeżenie: (0%)
-----


Chyba jednak to nie jest wina mysql. Wrzucilem baze do MSSQL'a i wynik jest taki sam.
Takze teraz juz nie mam pojecia co z tym zrobic.
Go to the top of the page
+Quote Post
Jabol
post 20.07.2005, 19:16:44
Post #16





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


Odpowiedź jest bardzo prosta: musisz policzyć każdą wartość odzielnie. Wiem, że to troszkę nieestetyczne objeście, ale rzeczywiście LEFT JOIN generuje Ci dużo g.
Go to the top of the page
+Quote Post
SongoQ
post 20.07.2005, 20:10:05
Post #17





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


@Jabol Nie wiem co sie kryje pod tym "g" ale wydaje mi sie ze jak by cos LEFT JOIN nieprawidlowo dzialal to by generowal za kazdym razem inne rekordy, jesli wyniki sa dokladnie takie same w 2 bazach danych to wydaje mi sie ze to wina jest zapytania.

@beeper Jak bys mogl to barzo prosze o zrzut SQL struktury i danych najlepiej na @, chce cos pokombinowac.


--------------------
Go to the top of the page
+Quote Post
Jabol
post 20.07.2005, 21:50:46
Post #18





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


Cytat(SongoQ @ 2005-07-20 21:10:05)
@Jabol Nie wiem co sie kryje pod tym "g" ale wydaje mi sie ze jak by cos LEFT JOIN nieprawidlowo dzialal to by generowal za kazdym razem inne rekordy, jesli wyniki sa dokladnie takie same w 2 bazach danych to wydaje mi sie ze to wina jest zapytania.

@SongoQAleż left join działa znakomicie. Dokładnie tak jak trzeba. Po prostu służy do innych zastosowań, a w tym konkretnym przypadku generuje wiele "g.", czyli niepotrzebnych w tym zastosowaniu rekordów. Bo on nie robi tego "całościowo". On tutaj kleji każdy rekord oddzielnie i nie patrzy, czy już z niego korzystał.

@beeper: popróbuj z widokami (tutaj schowane)
Kod
SELECT win.id, kw1.kw, kw2.kw, kw3.kw
FROM win
LEFT JOIN (SELECT id, sum(kwota1) AS kw FROM kwota1 GROUP BY  id) AS kw1 ON (win.id=kw1.id)
LEFT JOIN (SELECT id, sum(kwota2) AS kw FROM kwota2 GROUP BY  id) AS kw2 ON (win.id=kw2.id)
LEFT JOIN (SELECT id, sum(kwota3) AS kw FROM kwota3 GROUP BY  id) AS kw3 ON (win.id=kw3.id);

Czy jak to się tam nazywa - podzapytania. Ale możesz te podzapytania wyprowadzić do widoków i będzie ok (podzapytania w ten sposób działają na pgsql'u, ale ze to na mysql'u pójdzie nie ręcze, a widoki chyba nawet mysql ma).
Acha, nazwy tabel to sobie wymyśliłem jak przenosiłem strukturę na lokala. win to windykacja, kwota1 to kosztywf, kwota2 to kosztyww a kwota3 to wpłaty (czy jakkolwiek w dowolnej kolejości).


XXX: DAŁEM CODE, bo SQL nie działa (wywala mi jakieś fragmenty html'a);

Ten post edytował Jabol 20.07.2005, 22:30:48
Go to the top of the page
+Quote Post
beeper
post 20.07.2005, 23:07:36
Post #19





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 20.01.2005

Ostrzeżenie: (0%)
-----


Dzieki wielkie wszystkim za pomoc.
Oto rozwiazanie winksmiley.jpg
  1. SELECT
  2. windykacja.IDwierzyciela,
  3. (
  4. SELECT SUM(kosztywf.Kwota)
  5. FROM kosztywf WHERE kosztywf.idwierzyciela = windykacja.idwierzyciela
  6. GROUP BY kosztywf.IDwierzyciela
  7. ) AS KosztyWfSum,
  8. (
  9. SELECT SUM(kosztyww.Kwota)
  10. FROM kosztyww WHERE kosztyww.idwierzyciela = windykacja.idwierzyciela
  11. GROUP BY kosztyww.IDwierzyciela
  12. ) AS KosztyWWSum,
  13. (
  14. SELECT SUM(wplaty.WplatyKwota)
  15. FROM wplaty WHERE wplaty.idwierzyciela = windykacja.idwierzyciela
  16. GROUP BY wplaty.IDwierzyciela
  17. ) AS WplatySum
  18. FROM windykacja
Go to the top of the page
+Quote Post
SongoQ
post 21.07.2005, 01:02:34
Post #20





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


@Jabol
Cytat
@beeper: popróbuj z widokami (tutaj schowane)

Widoki to zupelnie inna sprawa, tak naprawde tutaj chodzi jak juz pozniej napisales podzapytania (podselecty). Widok to tak naprawde zapytanie zapisanie w bazie danych, jak jest zapytnie do widoku wykonywane to jest wykonywane dolaczania zapytania i optymalizacja.

Bardzo czesto stosuje widoki, ulatwiaja sprawe. Drobna zmiana modyfikuje w jednym miejscu widok i caly system dziala tak jak nalezy, zapominam o kodzie php.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 06:39