Trzepak.pl


Nowy temat  Odpowiedz w temacie
Autor Wiadomość
Post: pt, 25 maja 2018 15:33:01 
   Tytuł: mysql i select + sum
Odpowiedz z cytatem
Offline
Leniwy eseista
Leniwy eseista
Awatar użytkownika

Rejestracja: pn, 13 mar 2006 23:01:57
Posty: 620
Witam
Studiowalem wiele wiele lat temu, niewiele zostalo w glowie z baz danych.
Musze zrobic zapytanie SQL, ktore policzy mi saldo (roznica sumy oplat i sumy wplat w danym roku) dla kazdego klienta
tabele wygladaja nastepujaco :

tabela klienci
poleid nazwisko
1 kowalski
2 nowak

tabla wplaty
poleid userid kwota data
1 1 40 2018-05-20
2 1 10 2018-05-20
3 2 50 2018-05-25


tabela oplaty
poleid userid kwota rok miesiac
1 1 50 2018 5
2 2 50 2018 5
3 3 50 2018 5

Kto poratuje i skonstruuje mi zapytanie sql ?
Mam cos takiego (bez roznicy)
SELECT sum(case when oplaty.rok=2018 then oplaty.kwota else 0 END) as suma_oplaty, sum(case when (wplaty.data between '2018-01-01' AND '2018-12-31') then wplaty.kwota else 0 end) as suma_wplaty, klienci.nazwisko as nazwisko, klienci.imie as imie FROM klienci, oplaty, wplaty WHERE wplaty.userid=klienci.poleid and oplaty.userid=klienci.poleid and (wplaty.data between '2018-01-01' AND '2018-12-31') GROUP BY klienci.poleid order by klienci.nazwisko

zlicza, ale chyba dodatkowo oplaty/wplaty z lat poprzednich.
Brakuje mi w SUM powiazania z id klienta, za cholere nie pamietam jak to polaczyc.


Na górę
Post: pt, 25 maja 2018 18:14:43 
Odpowiedz z cytatem
Offline
Moderator
Moderator
Awatar użytkownika

Rejestracja: czw, 18 lis 2010 9:00:53
Posty: 3446
Lokalizacja: Mazury
Ja nawet nie zacząłem studiów. Zrobiłbym tak:
Kod:
SELECT nazwisko, imie, 
IFNULL((SELECT SUM(kwota) FROM oplaty WHERE userid =klienci.poleid AND rok =2018), 0) AS suma_oplaty,
IFNULL((SELECT SUM(kwota) FROM wplaty WHERE userid =klienci.poleid (data BETWEEN '2018-01-01' AND '2018-12-31')), 0) AS suma_wplaty
FROM klienci
ORDER BY nazwisko

_________________
# http://kazuko.pl ☚☜☚☜


Na górę
Post: pt, 25 maja 2018 18:19:08 
Odpowiedz z cytatem
Offline
Leniwy eseista
Leniwy eseista
Awatar użytkownika

Rejestracja: pn, 13 mar 2006 23:01:57
Posty: 620
SUPER brakowalo jednego AND, ale o to chodzilo :)
sugeruje studia informatyczne :)
Kod:
SELECT nazwisko, imie, 
IFNULL((SELECT SUM(kwota) FROM oplaty WHERE userid=klienci.poleid AND rok=2018), 0) AS suma_oplaty,
IFNULL((SELECT SUM(kwota) FROM wplaty WHERE userid=klienci.poleid AND (data BETWEEN '2018-01-01' AND '2018-12-31')), 0) AS suma_wplaty
FROM klienci
ORDER BY nazwisko


Dzieki


Na górę
Post: pt, 25 maja 2018 18:22:20 
Odpowiedz z cytatem
Offline
Moderator
Moderator
Awatar użytkownika

Rejestracja: czw, 18 lis 2010 9:00:53
Posty: 3446
Lokalizacja: Mazury
Na emeryturze pójdę :zlosnik:

_________________
# http://kazuko.pl ☚☜☚☜


Na górę
Post: pt, 25 maja 2018 18:52:25 
Odpowiedz z cytatem
Offline
Leniwy eseista
Leniwy eseista
Awatar użytkownika

Rejestracja: pn, 13 mar 2006 23:01:57
Posty: 620
wkleilem do swojego skryptu php i wychodzi, ze to troche malo optymalne. Znacznie szybciej wykonuje mi : (w wielkim skrocie)
while mysqlquery(select * from klienci)
{
sumaoplat = mysqlquery(select sum(kwota) as sumaoplat from oplaty where userid=poleid)
sumawplat = mysqlquery(select sum(kwota) as sumawplat from wplaty where userid=poleid)
echo sumaoplat-sumawplat
}

w bazie mam rozliczenia z klientami od 2004 roku.... rekordow 80 000


Na górę
Post: sob, 26 maja 2018 19:02:59 
Odpowiedz z cytatem
Offline
Moderator
Moderator

Rejestracja: pt, 02 lis 2007 19:20:15
Posty: 1495
Lokalizacja: Katowice
Pewnie BETWEEN nie łapie w index, jak wydajność jest ważna to spróbuj dodać index na userid i date.

_________________
Andrzej Erenc - awHost.pl (Tanie i wydajne serwery VPS)


Na górę
Post: sob, 26 maja 2018 21:02:54 
Odpowiedz z cytatem
Offline
Leniwy eseista
Leniwy eseista
Awatar użytkownika

Rejestracja: pn, 13 mar 2006 23:01:57
Posty: 620
moglbys bardziej doprecyzowac ?
Tym skryptem listuje sobie saldo klientow, by wylapac zapominalskich. Lista generuje sie obecnie 1-2 minuty. Pakujac calosc w jedna kwerende sql, czas wydluzyl sie do 4-5 minut :)


Na górę
Post: sob, 26 maja 2018 22:39:09 
Odpowiedz z cytatem
Offline
Moderator
Moderator

Rejestracja: pt, 02 lis 2007 19:20:15
Posty: 1495
Lokalizacja: Katowice
Kod:
CREATE INDEX wplaty_userid_date ON wplaty(userid, data);
CREATE INDEX oplaty_userid_rok ON oplaty(userid, rok);


Pisanie z palca, więc nie jestem pewny czy zadziała, ale jak wrzucisz te dwa kody do sqla, to powinno szybciej przeszukiwać tabele.
To samo możesz wyklikać z phpmyadmina.

_________________
Andrzej Erenc - awHost.pl (Tanie i wydajne serwery VPS)


Na górę
Post: wt, 29 maja 2018 17:45:42 
Odpowiedz z cytatem
Offline
Leniwy eseista
Leniwy eseista
Awatar użytkownika

Rejestracja: pn, 13 mar 2006 23:01:57
Posty: 620
no teraz cud miodzio :)
dzieki Andrew_wojownik
Jak sie bedizemy gdzies widziec, masz u mnieflache :)
moj sposob przeliczania w osobnych kwerendach SQL tez znacznie przyspieszyl - nie ma potrzeby optymalizacji zapytania sql, wystarczylo utworzytc indeksy.


Na górę
Wyświetl posty nie starsze niż:  Sortuj wg  
Nowy temat  Odpowiedz w temacie


Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości


Nie możesz tworzyć nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Przejdź do:  
Dzisiaj jest wt, 20 lis 2018 9:26:09

Strefa czasowa UTC+02:00

Moderatorzy: Administratorzy, Moderatorzy

Nakarm glodne dziecko - wejdz na strone www.Pajacyk.pl


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
SubSilver2 modified for Trzepak.pl by Colir
Polski pakiet językowy dostarcza phpBB.pl