![]() |
![]() ![]() |
![]() |
![]()
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:
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 |
|
|
![]()
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?
|
|
|
![]()
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:
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 |
|
|
![]()
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)
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
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
Ale w momencie kiedy dodaje jeszcze jedno zlaczenie, wynik jest znowu nieprawidlowy :/
|
|
|
![]()
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. -------------------- |
|
|
![]()
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
Wynik jest poprawny i wyglada tak ![]() To samo dla wplat
![]() Jezeli zrobie tak:
to wszystko gra i dobrze liczy ![]() Ale jak dodam kolejna tabele to juz sie sypie
![]() |
|
|
![]()
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. -------------------- |
|
|
![]()
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.
|
|
|
![]()
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. -------------------- |
|
|
![]()
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
Ten post edytował beeper 20.07.2005, 14:08:54 |
|
|
![]()
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%) ![]() ![]() |
Sprawdz co to Ci zwroci, czy jak zsumujesz recznie to bedzie ok? -------------------- |
|
|
![]()
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 |
|
|
![]()
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 ![]() -------------------- |
|
|
![]()
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. |
|
|
![]()
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.
|
|
|
![]()
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. -------------------- |
|
|
![]()
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 |
|
|
![]()
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 ![]()
|
|
|
![]()
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. -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 06:39 |