Autor Zpráva
xoxo
Profil
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 *
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
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
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,
Tusim bych tam dal jeste distinct (jmeno) .
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
Dekuju za odpovedi, no budu to muset udelat uplne bokejm mimo vsechno doposud realizovane.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: