1 (edited by Dzimisii 2009-01-29 00:50:32)

Topic: sum funkcija

Turiu tokia problema, kad man netaip veikia sum kaip as noreciau.
Problema ta, kad dabar kai atimu is skaiciau nieka ir paskui susumuoju, nieka ir gaunu :]
O as noriu taip: skaipcius + niekas = tas skaicius. Ta nieka kaip nors paversti i 0.

Suprantu, kad painiai cia viskas, pabandysiu paaiskinti pavyzdziu.

Abonentas  Susimoketa
Tadas         25
Tadas         50
Karolis        60
Justas         70


Abonetas  Skola
Tadas       20
Karolis      60
Algirdas    60

select Abonetas, ( Sum( Susimoketa ) - Skola) AS Likutis
Kadangi Algirdas nieko nesusimokejo, jo tada is vis nerodo, o reiketu, kad rodytu ta skola 60, ta prasme, kad kaip nors padarytu 0 -60

Re: sum funkcija

čia kaip suprantu pas tave yradvi lentelės.

Aš daryčiau taip:
a) pirmą lentelę sugrupuočiau pagal abonentą ir panaudočiau SUM() suskaičiuoti kiek tas abonentas viso yra sumokėjęs.
b) tada antrą lentelę jungčiau su pirma pasinaudodamas LEFT JOIN'u (kairys jungimas) - tokiu atveju gaučiau visų skolingų abonentų sąrašą suklijuotą su apmokėjusiais abonentais; pirmoje lentelėje nebus tokio abonento, kuris yra skolingas (pirmoje lentelėje) tada prie jo Sumoketa stulpelio rodys 0 (čia jeigu stulpelio tipas yra INT);
c) Iš Sumoketa stulpelio atimčiau Skola stulpelį ir gaučiau tai ko reikia;

Rašyk užklausas, rodyk kas gaunasi ir kas nesigauna (-;

Re: sum funkcija

Laukus negaliu naudoti INT, nes juk cia sumos, raik skaiciu ir po kablelio.Tai gal del to ir blogai gaunas, nes vel rasu NULL ir galutines sumos negaunu

SELECT apmokejimai.Abonentas, SUM(Susimoketa), Skola, 
(SUM(Susimoketa) - Skola) AS Likutis
FROM apmokejimai
LEFT JOIN skolininkai ON
apmokejimai.Abonentas = skolininkai.Abonentas
GROUP BY apmokejimai.Abonentas

Re: sum funkcija

Dzimisii wrote:

Laukus negaliu naudoti INT, nes juk cia sumos, raik skaiciu ir po kablelio

Tai naudok FLOAT.

Re: sum funkcija

hum... Tai, kad su FLOAT lyginai tas pats:

Abonentas  SUM(Susimoketa)  Skola  Likutis 
Justas          70                       NULL  NULL
Karolis         60                       60      0
Tadas          75                       20      55

Re: sum funkcija

Na iš tikro, pabandžiau pats, tas pats. Kol kas ant greitųjų nieko gero nesugalvoju apart bandymo naudoti IFNULL(stulpelis, 0) funkciją. Blogai tame, kad dinamiškai vyksta tikrinimas kiekvienai reikšmei, jeigu duomenų nedaug tai nieko tokio, jeigu daug reikėtų ieškoti lengvesnio metodo.

Re: sum funkcija

Na ikaliau ta IFNULL ir lyg viskas veikia gerai...

Prie to pacio norejau paklausti, ar gerai, kai naudoju du kartus SUM gauti tai paciai reiksmei?
Jei negerai, tai kaip priskirti ir paskui pasiimti? Nes zinoma su AS neis dirbti, nes tai nebus realus laukas

SELECT apmokejimai.Abonentas, SUM( Susimoketa ) , IFNULL( Skola, 0 ) , (
SUM( Susimoketa ) - IFNULL( Skola, 0 )
) AS Likutis
FROM apmokejimai
LEFT JOIN skolininkai ON apmokejimai.Abonentas = skolininkai.Abonentas
GROUP BY apmokejimai.Abonentas
LIMIT 0 , 30

Re: sum funkcija

Jeigu duomenų nėra daug tai nesuk galvos. Jeigu yra jau daugiau tada reikia kažką daryti.

Vienas iš būdų yra naudoti VIEW'ą, kuriame būtų suskaičiuotos sumos, kurios atsinaujintu automatiškai kas kartą modifikuojant lentelės.

Kitas iš būdų bandyti naudoti kintamuosius, bet čia yra vėl tam tikrų niuansų, kurie kartais apsunkiną užklausą. Kaip priskirti kintamajam sumą:

SELECT @suma_sumoketa := SUM( Susimoketa ), ...

Re: sum funkcija

Dzimisii wrote:

Na ikaliau ta IFNULL ir lyg viskas veikia gerai...

Prie to pacio norejau paklausti, ar gerai, kai naudoju du kartus SUM gauti tai paciai reiksmei?
Jei negerai, tai kaip priskirti ir paskui pasiimti? Nes zinoma su AS neis dirbti, nes tai nebus realus laukas

SELECT apmokejimai.Abonentas, SUM( Susimoketa ) , IFNULL( Skola, 0 ) , (
SUM( Susimoketa ) - IFNULL( Skola, 0 )
) AS Likutis
FROM apmokejimai
LEFT JOIN skolininkai ON apmokejimai.Abonentas = skolininkai.Abonentas
GROUP BY apmokejimai.Abonentas
LIMIT 0 , 30

Galima ir du kartus SUM naudoti, niekas per galvą neduos