Nette Database a SUM nad aliasy
- MW
- Člen | 626
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
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?
- MW
- Člen | 626
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
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
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
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.