SQL dotaz – fetchPairs s posloupností
- Newer
- Člen | 47
Ahoj, mám takový složitejší sql dotaz , kde se grupuje po dnech a počítá se vážený průměr......
výsledek je indexované pole, kde klíč je datum, a hodnota je výpočet…
a potřeboval bych SQL dotaz, kdy hodnota bude připočítávat i minulé dny…
tzn tabulka např:
datum – hodnota
1.1.2020 – 2
1.2.2020 – 4
1.3.2020 – 1
1.4.2020 – –5
a výsledek bych si představoval…
1.1.2020 – 2
1.2.2020 – 6
1.3.2020 – 7
1.4.2020 – 2
vždy jde tedy o sumu všecg předchozích dat k aktuálnímu, stačí mne nakopnout, pak si to sestavím a aplikuji na svůj SQL dotaz.
Děkuju moc:-)
Editoval Newer (30. 6. 2020 12:44)
- David Matějka
- Moderator | 6445
ahoj, hledej na google „running total“. záleží, co máš za databázi, respektive jestli podporuje window funkce – postgresql, mssql server a mysql od verze 8. pokud máš starší mysql, tak se to řeší pomocnou proměnnou, viz jeden příklad ze stackoverflow:
SET @runtot:=0;
SELECT
q1.d,
q1.c,
(@runtot := @runtot + q1.c) AS rt
FROM
(SELECT
DAYOFYEAR(`date`) AS d,
COUNT(*) AS c
FROM `orders`
WHERE `hasPaid` > 0
GROUP BY d
ORDER BY d) AS q1
- Newer
- Člen | 47
tak se sem musím obrátit ještě jednou protože mi všechny možné kombinace vyhazují PDOException #HY000, zkousel jsem to bez formatovani data, s fetchAll(); na konci bez fetchAll – tam je nejaka specialni chyba :-)) ..... ale proste se pres tu HY000 nedostanu.
<?php
return $this->database->query('SET @rununit:=0;
SELECT
DATE_FORMAT(added,?) AS `dateFormat`,
`result`,
`user_id`,
(@rununit := @rununit + `units`) AS `unitsTotal`
FROM `bets`
WHERE NOT `result` = ?
WHERE `user_id` = ?
GROUP BY `dateFormat`', '%Y-%m-%d', '0', $tiper)->fetchPairs('dateFormat', 'unitsTotal');
?>
- David Matějka
- Moderator | 6445
zkus to rozdelit na dva dotazy, tedy set a select do samostatneho volani query.
- Newer
- Člen | 47
mhmm, perfektní… Opět jsi mne navedl správně, díky tomu jsem odhalil i další chyby v SQL syntaxi… Děkuji ti.
<?php
$this->database->query('SET @rununit:=?', '0');
return $this->database->query('SELECT
DATE_FORMAT(added,?) AS `dateFormat`,
`result`,
`user_id`,
(@rununit := @rununit + `units`) AS `unitsTotal`
FROM `bets`
WHERE NOT `result`=?
AND `user_id`=?
GROUP BY `dateFormat`','%Y-%m-%d','0',$tiper)->fetchPairs('dateFormat', 'unitsTotal');
?>
- Newer
- Člen | 47
tak mi to samozrejme pocitalo spatne neprenaselo to soucty group hodnot ale vzdy jen jednu z daneho dne....... je potreba zanorit SELECT do SELECT kde je ten group a tam to brat… njn, on mi to @DavidMatějka psal …
<?php
$this->database->query('SET @rununit:=?', '0');
return $this->database->query('SELECT dt.*,
round((@rununit := + @rununit + dt.totalunits),?) AS `unitsTotal`
FROM (
SELECT t1.*,
DATE_FORMAT(t1.added,?) AS `dateFormat`,
sum(t1.units) AS `totalunits`
FROM `bets` AS `t1`
WHERE `result`<>?
AND `user_id`=?
GROUP BY `dateFormat`) AS `dt`
CROSS JOIN (SELECT @running_total := 0) AS t2 ', '3', '%Y-%m-%d', '0', $tiper)->fetchPairs('dateFormat', 'unitsTotal');
}
?>
Editoval Newer (2. 7. 2020 11:16)