PDA

View Full Version : MySQL: Kombinasi SQL utk SUM dan MIN


pogostik
10-04-03, 08:24 PM
Salam...

nak mintak tolong pasal SUM & MIN dalam SQL statement. aku nak jumlahkan (SUM) nilai minima (MIN) dari setiap rekod. rekod rekod tu dibezakan oleh inv_no. statement yang aku dah buat:

SELECT SUM( MIN( inv_amount ))
FROM invoice
GROUP BY inv_no;

statement tu menjadik dan kuar result spt yang aku nak...tapi tu kalau aku execute kat Oracle...bila aku execute kat MySQL, kuar error: Invalid use of group function

sesapa leh tolong tak ??...

cth table structure:

inv_no | inv_amount
-------+------------------
18408 | 1000.00
18408 | 500.00
17431 | 2500.00
17431 | 750.00
16278 | 200.00

...i'm using MySQL database ver. 3.23.39

r0kawa
11-04-03, 09:30 AM
emm.. query ni memang ko rasa betul ke dari segi logik ?

sekarang ni


SELECT MIN( inv_amount )
FROM invoice
GROUP BY inv_no;

akan keluarkan nilai minimum yang setiap inv_no ada, jadi, kalau inv_no ada 3, maka dia akan keluarkan nilai yang paling minimum

contoh keluaran (ikut data yang ko kasik)

inv_no inv_amount MIN( inv_amount )
16278 200.00 200.00
17431 2500.00 750.00
18408 1000.00 500.00

lepas tu, kalau
SELECT SUM( inv_amount )
FROM invoice
GROUP BY inv_no;


inv_no inv_amount SUM( inv_amount )
16278 200.00 200.00
17431 2500.00 3250.00
18408 1000.00 1500.00


jadi, kalau mengikut teori query yang ko buat

SUM(MIN(inv_amout))

dia nak jumlahkan nilai MIN yang dah memang akan keluarkan satu nilai :-/

boleh ke?

Hehe.. aku pun tak bagus dalam mysql. Oracle boleh keluar ke benda tu?

kambinggila
11-04-03, 11:49 AM
ko sure ke apa yang ko query tu betul... apa yang ko nak sebenarnya? let say ko ada 5 rekod macam di bawah

a - 100
a - 150
b - 100
b - 50
c - 200

pastu ko nak sum minimum amount untuk setiap inventory kod kan... patutnya dia akan jadik macam nih

---------- ---------------
350

apasal query ko keluar macam tu plak? tak paham la hehe takpe ko jelaskan situasi ko aku try tolong :)

r0kawa
11-04-03, 12:27 PM
aku rasa dalam mysql, dia cuma sumkan by group punya clause...

so kalau dalam group tu ada 3 result, dia akan tambahkan, bukan hasil semua baris dia addkan.

kalau ada 3 nilai minimum

a - 100
b - 50
c - 200

sekarang ni pogostik nak buat


SUM(MIN(inv_amout))

sum(100) - bagi group by a
sum(50) - bagi group by b
sum(200) - bagi group by c

jadinya tak boleh keluar result la patutnya, takde benda yang nak ditambahkan bagi setiap group

Kalau oracle aku rasa boleh guna facility subselect utk dapatkan hasil query tu kot. mysql berapa ntah ada support subselect dan bukan guna table type MyISAM aku rasa innodb/geminidb kot ?

kambinggila
11-04-03, 03:57 PM
tapi rokawa kalau ikut sample dia keluar merepek... sebab macam dia sum semua sekali bukan minimum value jer sebab kalau macam tu nampak macam dia repeat result dia tah ler...

betul cakap ko tu oracle memang ada & most transact-sql ada...

r0kawa
11-04-03, 04:11 PM
hehe.. apa yang dia bagi, aku rasa adalah sample data yang dia ada, bukan hasil query dari oracle tu.

takper, kita tunggu pogostik jawab dulu

pogostik
13-04-03, 10:09 AM
mule mule, mintak maap pasal lambat reply...bukannye aku lupe tapi aku takleh nak access bincang.net kat umah aku...kuar page error...(ade orang lain yang kena cenggini tak, pakai streamyx)..

pahtu pasal SQL statement, aku tersilap...sebenarnye statement dia cenggini (having tested on oracle):

SELECT SUM( MIN(inv_amount))
FROM invoice;

takde GROUP BY clause tu...masa aku test kat oracle, takdak error dan kuar result dia...tapi bile test kat MySQL, kuar error Invalid use of group function....

Lagi satu similar statement:
select sum(minamount)
from ( select min(inv_amount) as minamount
from invoices group by invoice_number
)

tapi version MySQL yang aku pakai takleh buat mende nih...(maybe supported in MySQL ver 4.1)...

kambinggila
14-04-03, 12:34 AM
select sum(minamount)
from ( select min(inv_amount) as minamount
from invoices group by invoice_number)

salah statement ko nih...

ko kene buat macam nih

select sum(minamount)
from invoice
where inv_amount in (select min(inv_amount)
from invoice
group by invoice_number)


pogostik ko try buat camni takleh gak ko post error dia

pogostik
14-04-03, 08:44 AM
You have an error in your SQL syntax near 'select min(inv_amount)

hmmm...takleh wat subselect laa...aku guna MySQL 3.23.39....yang version 4.1 leh buat subselect.....

r0kawa
14-04-03, 10:47 AM
kalau nak guna min() dan max() dalam mysql kena ada group by function. sebab dalam docs dia cakap camtu :-/

Sub select aku pun tak penah guna dalam mysql, still guna 3.23 kot kalau tak salah.


kalau ko nak guna query yang sama, cuba guna postgresql www.postgresql.org .

kambinggila
15-04-03, 04:11 PM
aiyark... blank tahap cipan hehehe.. nanti aku carik camner :)

pogostik
15-04-03, 07:31 PM
...takpe aaa....aku buat plan b...hehe...manipulate data tu guna php....select seme min value untuk setiap invoice then campak masuk dalam table lain...cuma aku rase cam tak kena je buat cenggitu...pasal proses updating berlaku setiap kali user view page tu...hehe...kalu sesapa ade idea yang lagi baik, mintak tolong beritahu... :)

time kasih kpd seme yang telah membantu....