sum, count, max, min bersamaan

Agan-agan,

Suhu-suhu,

Guru-guru…

Bagaimana car mendapatkan

"select A.field1, A.field2, sum(B.harga), count(B.id), max(B.harga), min(B.harga)

from A

Join B.xx = A.xx "

dengan active record?

Telah saja coba dengan relation




public function relations()

	{

       return array(

                   'agregate'=>array(self::STAT,'B','A_id',

			'select'=>'sum(B.price) as Total, count(B.B_id) as jumlah,  

                                   max(B.price) as maks, min(B.price) as Min' )

                   )

    }




gak bisa

mohon diterawang…

apa ada pesan error:

atau mungkin bisa dengan jalan mendefinisikan masing-masing agregate




public function relations()

{

	return array(

		'agregateSum'=>array(

			self::STAT,'B','A_id',

			'select'=>'sum(B.price)' 

		),

		'agregateCount'=>array(

			self::STAT,'B','A_id',

			'select'=>'count(B.B_id)' 

		),

		'agregateMax'=>array(

			self::STAT,'B','A_id',

			'select'=>'max(B.price)' 

		),

		'agregateMin'=>array(

			self::STAT,'B','A_id',

			'select'=>'min(B.price)' 

		),

   )

}

ada pun pada viewnya:




<?php

    $data = A::model()->findAll();

    foreach ($data as $dataItem)

    {

	echo $dataItem->id;

   		echo "Total = ".$dataItem->agregateSum;

   		echo "Count = ".$dataItem->agregateCount;

   		echo "Min = ".$dataItem->agregateMin;

   		echo "Max = ".$dataItem->agregateMax;

    }

?>



apa mungkin karena belum pakai "group" ??

ini ada contoh yang dipakai, di thread sebelah




'rating' => array(self::STAT, 'Rating', 'walk_id',

                        'select' =>'ROUND(AVG(rating))',

                        'group' => 'walk_id',

                ),



terima kasih suhu, yang ini bisa…

dari awal saya memang tidak mencoba trik begini karena khawatir akan ada dua join sehingga selain merusak hasinya juga menyita resouresnya DB,

tapi hasilnya sih bener keluar tapi soal resourcesnya ane kurang paham nih… sebelum ada yang meng-konfirmasi trik diatas tidak boros resources, ane masih deg-degan makainya…

trim again bos nasrul,

iya, saya juga berfikir demikian, :P

mungkin bisa pula melalui findAllBySql() http://www.yiiframework.com/doc/api/1.1/CActiveRecord#findAllBySql-detail




<?php

    $sql="

        SELECT

                A.id, 

                sum(B.price) as Total, 

                count(B.B_id) as jumlah, 

                max(B.price) as maks, 

                min(B.price) as Min

        FROM 

                A INNER JOIN B ON A.ID=B.A_ID

        ";


    $data = A::model()->findAllBySql($sql);

    foreach ($data as $dataItem)

    {

	echo $dataItem['id'];

   	echo "Total = ".$dataItem['Total'];

   	echo "Count = ".$dataItem['jumlah'];

   	echo "Min = ".$dataItem['Min'];

   	echo "Max = ".$dataItem['maks'];

    }

?>



sepertinya emang harus carving sql sendiri ya bos, sementara ini keputusan apa pake relational AR atau carving sql bisa dengan mempertimbangkan kemungkinan banyaknya data…

go go Yii

hasil nya di tampilkan dlm Cgrigview gimana bro :rolleyes:

menampilkannya di gridview mungkin begini gan…

tapi belum dicoba ya cuma main comot nih




<?php $this->widget('zii.widgets.CDetailView', array(

	'data'=>$data ,

	'attributes'=>array(

		

		array('name'=>'total','value'=>$data->agregateSum->s),

		array('name'=>'count','value'=>$data->agregateCount->s),

                array('name'=>'minimal','value'=>$data->agregateMin->s),

		array('name'=>'maximal','value'=>$data->agregateMax->s),

	),

)); ?>



kalo seperti code diatas, apa perlu didefinisikan terlebih dahulu ya, Total, jumlah, min dan maks nya.

soalnya ketika saya coba spt cara itu mesti ada pernyataan kalo field yg digunakan sebagai "as" itu bukan merupakan property salah satu tabel.

kalo saya baca di threadsebelah ada yg jawab spt ini

mohon petunjuk dari suhu2 sekalian, ane gak paham maksudnya.

menurut sy, tergantung arsitektur dbnya. biasanya untuk mysql butuh enclosed (`) untuk menandai object dalam database. sehingga sql harusnya menjadi:





$sql="

        SELECT

                `A`.`id`, 

                sum(`B`.`price`) as `Total`, 

                count(`B`.`B_id`) as `jumlah`, 

                max(`B`.price) as `maks`, 

                min(`B`.`price`) as `Minimum`

        FROM 

                `A` INNER JOIN `B` ON `A`.`ID`=`B`.`A_ID`

        ";



beda halnya denga sqlite, enclosed tidak diperlukan atau bahkan kadang dibutuhkan dengan quote (")

untuk kasus ini solve dari zaccaria mungkin yang terbaik:

sehingga jika disesuaikan dengan kasus kita harusnya menjadi




$criteria= new CDbCriteria;

$criteria->select= '`A`.`id`,sum(`B`.`price`) as Total,count(`B`.`B_id`) as jumlah, max(`B`.`price`) as maks,min(`B`.`price`) as minimum';

$criteria->join= 'INNER JOIN `B` USING(`A_ID`)';

//$criteria->condition='`customer_company`=1';      //pada kasus kita tidak ada kondisi

A::model()->findAll($criteria);



atau jika Kamu telah mendefinisikan relations A ke B pada model A




public function relations()

	{

		return array(

   						'relKeB'=>array(selff::HAS_MANY, 'B', 'A_ID'),

		);

	}

kita dapat menggunakan attribut with pada CDbCriteria

[size="2"]




$criteria= new CDbCriteria;

$criteria->select= '`id`,sum(`price`) as Total,count(`B_id`) as jumlah, max(`price`) as maks,min(`price`) as minimum';

$criteria->with='relKeB';

A::model()->findAll($criteria);

[/size]

semoga berhasil

makasih penjelesannya gan, semakin menambah pengetahuan.

cuma cara mengakses Total itu gimana ya ?

ane coba yang lebih sederhana spt ini :




  $criteria= new CDbCriteria;

  $criteria->select= 'sum(`nominal`) as Total';

  $cari=A::model()->findAll($criteria);

  $jumlahTotal = $cari->Total;


  return $jumlahTotal;



nah dibrowser tampil pesan spt ini :

CException

Deskripsi

Properti "A.Total" tidak didefinisikan.

karena waktu mendesak selama ini sih ane pake algoritma penjumlahan aja gan, cm yg ky gitu kan gak keren ;D

[font="arial, verdana, tahoma, sans-serif"][size="2"]coba pakai [color="#1C2837"][font="monospace"][size="2"]


$cari['Total'];

[/size][/font][/color][/size][/font][font="arial, verdana, tahoma, sans-serif"][size="2"][color="#1C2837"][font="monospace"][size="2"]kalau mau pakai $cari->total, sepertinya harus definisikan


public $_total;

dari class model A.[/size][/font][/color][/size][/font][font="arial, verdana, tahoma, sans-serif"][size="2"][color="#1C2837"][font="monospace"] [/font][/color][/size][/font]

[color="#1C2837"][font="monospace"] [/font][/color]

Sukses gan, Makasih banget ya agan nasrul, tp mungkin bisa dijelaskan napa mesti di definisikan


public $_total;

terlebih dahulu ?

kalo ada link referensinya, ntar ane baca sendiri, soalnya yg pernah ane baca gak ada keterangan spt itu ato mungkin ada yg terlewatkan yah :D

sebelumnya ane udah coba pake setAttribut, dll tp gagal mulu.

o iya punya ane gak ada underscore( _ ) nya. soalnya tetap errornya kek yg sebelumnya kalo di kasih underscore ( _ ) karena “as” nya “total” gitu aja gak pake _ ;)

alhamdulillah, ana cuma ingat2 tutorial blog pada bagian mendefinisikan model User. http://www.yiiframework.com/doc/blog/1.1/en/prototype.auth

secara pada model A memang tidak ada atribut ‘total’, sehingga $A->total tidaklah dikenal. untuk itu kita perlu mendefinisikan atributnya secara public agar dapat diakses dari mana saja.

semoga cukup memberikan gambaran, dan mohon maaf atas keterbatasan ana.

mantap penghayatan agan :lol:

Mantap gan… Tapi ane belum tau cara menampilkan hasilnya ke CGridView?

Mohon pencerahannya dr agan2 sekalian. :D