Nette Database a SUM nad aliasy

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
MW
Člen | 626
+
0
-

Zdravím a prosím o radu.

Mam grid a posilam mu takova data :

public function getData($year) {

        return $this->database->table('contracts')->SELECT('id, name, branches_id, since, to,
				       (SELECT SUM(sum) FROM mrp WHERE MONTH(datzdanpln) = 12 AND YEAR(datzdanpln) = '.$year.'-1 AND mrp_cislo = cislo_zak) AS "lprosinec",
				       (SELECT SUM(sum) FROM mrp WHERE MONTH(datzdanpln) = 1 AND YEAR(datzdanpln) = '.$year.' AND mrp_cislo = cislo_zak) AS leden,
				       (SELECT SUM(sum) FROM mrp WHERE MONTH(datzdanpln) = 2 AND YEAR(datzdanpln) = '.$year.' AND mrp_cislo = cislo_zak) AS unor,
				       (SELECT SUM(sum) FROM mrp WHERE MONTH(datzdanpln) = 3 AND YEAR(datzdanpln) = '.$year.' AND mrp_cislo = cislo_zak) AS brezen,
				       (SELECT SUM(sum) FROM mrp WHERE MONTH(datzdanpln) = 4 AND YEAR(datzdanpln) = '.$year.' AND mrp_cislo = cislo_zak) AS duben,
				       (SELECT SUM(sum) FROM mrp WHERE MONTH(datzdanpln) = 5 AND YEAR(datzdanpln) = '.$year.' AND mrp_cislo = cislo_zak) AS kveten,
				       (SELECT SUM(sum) FROM mrp WHERE MONTH(datzdanpln) = 6 AND YEAR(datzdanpln) = '.$year.' AND mrp_cislo = cislo_zak) AS cerven,
				       (SELECT SUM(sum) FROM mrp WHERE MONTH(datzdanpln) = 7 AND YEAR(datzdanpln) = '.$year.' AND mrp_cislo = cislo_zak) AS cervenec,
				       (SELECT SUM(sum) FROM mrp WHERE MONTH(datzdanpln) = 8 AND YEAR(datzdanpln) = '.$year.' AND mrp_cislo = cislo_zak) AS srpen,
				       (SELECT SUM(sum) FROM mrp WHERE MONTH(datzdanpln) = 9 AND YEAR(datzdanpln) = '.$year.' AND mrp_cislo = cislo_zak) AS zari,
				       (SELECT SUM(sum) FROM mrp WHERE MONTH(datzdanpln) = 10 AND YEAR(datzdanpln) = '.$year.' AND mrp_cislo = cislo_zak) AS rijen,
				       (SELECT SUM(sum) FROM mrp WHERE MONTH(datzdanpln) = 11 AND YEAR(datzdanpln) = '.$year.' AND mrp_cislo = cislo_zak) AS listopad,
				       (SELECT SUM(sum) FROM mrp WHERE MONTH(datzdanpln) = 12 AND YEAR(datzdanpln) = '.$year.' AND mrp_cislo = cislo_zak) AS prosinec
					');
    }

potrebuji nad tim zavolat

public function getTotal() {
	return (float) $this->getData()->SUM('leden');
    }

Bezne toto funguje, ale pro aliasove sloupce ne…
Mohu prosim požádat o radu jak na to, nebo jak bych mohl prepsat dotaz?

Predem diky !

petr.pavel
Člen | 535
+
0
-

Proč bys měl chtít, aby počítač provedl 13 sub-selectů a sečetl v nich hodnotu, abys pak nakonec použil jen jeden z nich?

Majkl578
Moderator | 1364
+
0
-

Lepší by asi stejně byla kombinacee group by podle měsíce a podmínky.

MW
Člen | 626
+
0
-

Potrebuju i ty hodnoty ze radku a tohle je pro sum sloupec… resp každý sloupec budu sumovat ..

Majkl578 napsal(a):

Lepší by asi stejně byla kombinacee group by podle měsíce a podmínky.

Budu na to moci pak poslat ten sum?Jak jsi to myslel.. prepsat na Group a jak pak ty SUMy?

Jak by to mělo vypadat v NDB, prosim..

Moc diky !

Editoval MW (15. 2. 2014 9:28)

petr.pavel
Člen | 535
+
0
-

Nejdřív je potřeba si ujasnit, jak má vypadat správně ten výsledný dotaz, než se bude ladit pro NDB. Co takhle:

function getMonthTotal($year, $month = 1) {
  $total = $this->database->table('mrp')
    ->where('MONTH(datzdanpln)', $month))
    ->where('YEAR(datzdanpln)', $year)
    ->sum('sum');

  return (float) $total;
}

Mimochodem, je paskvil kombinovat češtinu a angličtinu. Make up your mind, man.
Jestli neplánujete najímat zahraniční programátory, tak je čeština úplně v pořádku.

MW
Člen | 626
+
0
-

Je to Nextras grid, kteremu podstrkavam data viz vyse.
A ja mu dodelal jen to, ze to template si poslu prave ten getTotal, coz delam v render() gridu jako komponenty a tam o month a year nemá tucha. Proto se porad snazim to nejak zlomit nebo upravit a získat ten SUM prave z jiz provedeného selection.

Vysledek je seznam zakazek, a u kazde je soucet vystavenych faktur za mesic po sloupcích. a ted potrtebuju ke každému SUM všech vždy ke každému mesici.

Mas pravdu.. je to spatne, ale taham ty data z jiné databaze a tam jsou sloupce anglicky a tak v ramci zachovani prehledu :/

Moc dekuji

Editoval MW (15. 2. 2014 11:01)

petr.pavel
Člen | 535
+
0
-

Jestli ti na výkonu nezáleží (pouští se výjimečně na nabušeném stroji), tak si definuj view se součty a pod-dotazy a dotaz do gridu udělej nad tím view. Tím pádem ten celkový součet se udělá taky nad view.

Pro každou normální aplikaci ale doporučuju tyhle souhrny cacheovat do zvláštní db tabulky.

MW
Člen | 626
+
0
-

Taky jsem se zacal uz uchylovat k tomu, ze to prehazim do tabulky vedle …
Tomu view se chci vyhnout.. prijde me to uz moc db zavisle..

Ještě me napada v te metode getTotal() nejakym iteratorem to projit a sečíst.. ale to je spis vize.. nevim jak na to…

Diky !