![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 6.10.2014 Ostrzeżenie: (0%) ![]() ![]() |
Witajcie, jestem tu nowy i mam pewien problem.
Dane są dwie tabele o tej samej strukturze: fm_expenses i fm_income w expenses przechowywane są dane o wydatkach a w income o dochodach ID int(11) SUMA float(10,2) DATA timestamp CATEGORY int(3) USERID int(11) Chcę zliczyć sumę fm_income jako dochody a fm_expenses jako wydatki robię to tak:
i wychodzą bzdury. Kosmiczne cyfry, zdaję sobie sprawę że skaszaniona relacja tu jest, ale za to zwraca to wszystko w ładnym formacie (dwa pola, wydatki i dochody). Wykombinowałem jescze jeden sposób:
Zwraca prawidłowe liczby ale wszystko w polu dochody i jako dwa rekordy. Jak to ugryźć? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
Tak to jest jak te dane się trzyma w dwóch różnych tabelach... Bez sensu.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
mmmmmmm,
Twoje pytanie zwróci błędny wynik jeśli użytkownik będzie dochód bez wydatku.
Ten post edytował trueblue 6.10.2014, 17:01:52 -------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 6.10.2014 Ostrzeżenie: (0%) ![]() ![]() |
Rozwiązanie które podał mmmmmmm podaje jak najbardziej prawidłowe wyniki, ma tylko jeden mankament, nie zwraca nic jeżeli dla danego usera (USERID) nie ma żadnego rekordu w wydatkach.
Rozwiązanie trueblue działa nawet jeśli nie ma rekordów w wydatkach lub dochodach ale niestety podaje nieprawidłowe sumy ![]() SQL wyrzucił mi takie sumy , pierwsze to rozwiązanie mmmmmmm, drugie to rozwiązanie trueblue wydatek dochod 2600.47 3316.95 1814.06999796629 1996.94998836517 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Podałem zapytanie dla wszystkich userów.
Spróbuj tak:
Ten post edytował trueblue 6.10.2014, 17:00:58 -------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 6.10.2014 Ostrzeżenie: (0%) ![]() ![]() |
Wyrzuca błąd
a co robi te
? Właśnie sobie uświadomiłem jak mało wiem o SQLu... |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Dodaj na końcu całości GROUP BY userid.
Umożliwia emulację tabeli przestawnej. -------------------- |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 6.10.2014 Ostrzeżenie: (0%) ![]() ![]() |
Tak teraz błędem nie rzuca, ale wciąż podaje niewłaściwe sumy.
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Na 100% jesteś pewien, że wynik nie jest poprawny?
Ja testuję na, co prawda, paru rekordach, ale jest ok. EDIT: Powinno być UNION ALL, choć nie wiem czy to jest przyczyną wyniku, który uznajesz za błędny. Ten post edytował trueblue 6.10.2014, 17:04:18 -------------------- |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 6.10.2014 Ostrzeżenie: (0%) ![]() ![]() |
Teraz już kompletnie odwaliło
Wrzucam takie zapytanie (zmieniłem userid z 1 na 2 , bo chciałem sprawdzić na małej ilości danych) mam w dochodach dwa rekordy SUMA=3.00 co powinno dawać 6 a w wydatkach jeden rekord SUMA=2.00 a drugi SUMA=2.50 co powinno dawać 4.50 Otrzymuję taki wynik: wydatek: 9 dochod: 12 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Niepotrzebne te LEFT JOIN.
Dla USERID=1
-------------------- |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 6.10.2014 Ostrzeżenie: (0%) ![]() ![]() |
Działa! wszystko cacy, punkcik powędrował.
Teraz jescze pare pytań żebym bezmyślnie nie kopiował i wklejał
- Skąd się bierze te 1 i 2 w tych Selectach po sumie ? - SUM(suma*(1-ABS(SIGN(typ-1)))) - jak to dokładnie działa, po co i dlaczego? |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Wydatek ma typ=1, dochód=2.
Dla typ=1 jeśli rekord ma typ=1, będzie suma*1, inaczej suma*0, analogicznie dla typ=2. Można to zastąpić taką konstrukcją:
Krótko: wartość suma wpada do sumowania wydatku jeśli jest wydatkiem, jeśli nie jest, nie wpada. Analogicznie dla dochodu. -------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 18:14 |