Autor | Zpráva | ||
---|---|---|---|
xoxo Profil |
#1 · Zasláno: 19. 1. 2018, 17:07:30
Zdravim, mam tabulku
jmeno, pocet, datum a chtel bych ziskat vystup za urcite obdobi, kde radky bude sloupec jmeno a sloupce vypis souctu za jednotlive mesice (datum). Napada me generovat podselekty nejakeho distinct(jmeno) nebo projit 2ma cykly v PHP, no nejde to nejak jednoduseji? Dik |
||
TomášK. Profil * |
#2 · Zasláno: 19. 1. 2018, 17:22:10
SELECT jmeno, SUM(pocet), YEAR(datum), MONTH(datum) FROM tabulka GROUP BY jmeno, YEAR(datum), MONTH(datum) |
||
Keeehi Profil |
SELECT jmeno, SUM(pocet), DATE_FORMAT(datum, '%M %Y') AS obdobi FROM tabulka GROUP BY jmeno, obdobi |
||
xoxo Profil |
Dekuju ze odpoved, no to asi nebude ono.
No ja bych chtel vystup neco jako: jmeno, pocet_obdobi_201701, pocet_obdobi_201702, pocet_obdobi_201703..... pricemz to obdobi bude zobrazeno podle filtru |
||
Keeehi Profil |
#5 · Zasláno: 19. 1. 2018, 17:35:43
xoxo:
Základ je určitě správně. Pak už záleží nejspíš jen na tom, jak to zobrazíš. „jmeno, pocet, obdobi_201701, obdobi_201702, obdobi_201703.....“ Tohle je potřeba vysvětlit, jelikož z toho není jasné, co chceš. co má být v kterém sloupci? |
||
xoxo Profil |
No jednotlive "dynamicky generovane sloupce" maji byt napocet mnozstvi za konkretni mesic (podle nazvu sloupce), jakoze group_by mi da sadu vysledku, kterou bych musel nejak ucesat do vystupu.
|
||
Kajman Profil |
Ano, převod z řádků do sloupců proveďte v aplikaci. Např. v php.
Mělo by to být lepší než generovat ty poddotazy, tedy něco jako select j.jmeno, (select sum(pocet) from tabulka t where t.jmeno=j.jmeno and t.datum between '2017-01-01' and '2017-01-31') as obdobi_201701, (select sum(pocet) from tabulka t where t.jmeno=j.jmeno and t.datum between '2017-02-01' and '2017-02-28') as obdobi_201702, ... from seznam_jmen j |
||
Keeehi Profil |
#8 · Zasláno: 19. 1. 2018, 18:49:16
xoxo:
A druhý sloupec (pocet) má být co? |
||
xoxo Profil |
Kajman:
select j.jmeno, (select sum(pocet) from tabulka t where t.jmeno=j.jmeno and t.datum between '2017-01-01' and '2017-01-31') as obdobi_201701, Jo, neco takoveho jsem chtel obejit obloukem, aplikaci mam "zprasenou" tak, ze nepocitam s generovanim cehokoli pred where a sada vysledku generuje vystup (je to doba, co jsem to spachal a obcas na to nevericne hledim). Keeehi: „A druhý sloupec (pocet) má být co?“ Sloupec pocet je pocet vyrobenych kusu k nejakemu datu a cil hry je udelat prehledovy report, kdy vyrobky (jmeno) budou vypsany na radcich a obdobi budou sloupce, klidne 50 sloupcu. |
||
Keeehi Profil |
xoxo:
„Sloupec pocet je pocet vyrobenych kusu k nejakemu datu“ Takže pokud jsem to správně pochopil, tak je to součet všech čísel na řádku za sloupců 3 - N. O něco jednodušší by bylo, kdyby takový součtový sloupec byl až na konci, ale toto je taky řešitelné. $sql = "SELECT jmeno, SUM(pocet) AS suma, DATE_FORMAT(datum, '%Y-%m') AS obdobi FROM tabulka GROUP BY jmeno, obdobi ORDER BY jmeno, obdobi"; $result = $mysqli->query($sql)) $lastProduct = null; echo '<table>'; while ($row = $result->fetch_assoc()) { if ($row['jmeno'] !== $lastProduct) { if ($lastProduct !== null) { echo '<tr>' . $row . '<td>' . $sum . '</td>' . $data . '</tr>'; } $row = '<td>'.$row['jmeno'].'</td>'; $sum = 0; $data = ''; } $lastProduct = $row['jmeno']; $sum += (int)$row['suma']; $data .= '<td>'.$row['suma'].'</td>'; } if (isset($row)) { echo '<tr>' . $row . '<td>' . $sum . '</td>' . $data . '</tr>'; } echo '</table>'; No a nebo $sql = "SELECT jmeno, SUM(suma) AS suma, GROUP_CONCAT(suma ORDER BY obdobi SEPARATOR '|') AS casti FROM (SELECT jmeno, SUM(pocet) AS suma, DATE_FORMAT(datum, '%Y-%m') AS obdobi FROM tabulka GROUP BY jmeno, obdobi ORDER BY jmeno, obdobi) AS t GROUP BY jmeno"; $result = $mysqli->query($sql)) echo '<table>'; while ($row = $result->fetch_assoc()) { echo "<tr><td>$row[jmeno]</td><td>$row[suma]</td><td>" . str_replace('|', '</td><td>', $row['cast']) . '</td></tr>'; } echo '</table>'; Celé to má ale tak trochu háček. Předpokládá to, že v každém měsíci je alespoň jeden záznam. Což se dá v tom prvním kódu řešit, v tom druhém ne. |
||
xoxo Profil |
#11 · Zasláno: 20. 1. 2018, 14:11:56
Dekuju za odpovedi, no budu to muset udelat uplne bokejm mimo vsechno doposud realizovane.
|
||
Časová prodleva: 6 let
|
0