21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
andrstom
Profil
Dobry den, ahoj

Jsem v pasti amatéra:-) - mám tabulku, ve které jsou uloženy data související s nakoupeným zbožím. Zkráceně - zboží je rozděleno do skupin (FaktSkup_II), dle data nakoupení (NakupDatum) a samozřejmě má nějakou cenu (CenaCelkova).
Já bych potřeboval zobrazit a porovnat celkovou cenu nakoupeného zboží v jednotlivých skupinách v období1 a v období2.

Nevím jak to nacpat do sql dotazu:-(

Pro představu přikládám část kódu, který potřebuji upravit:
 
<?php
$DatumOd1 = mysql_real_escape_string($_GET['ObdobiOd1']);
$DatumDo1 = mysql_real_escape_string($_GET['ObdobiDo1']);
$DatumOd2 = mysql_real_escape_string($_GET['ObdobiOd2']);
$DatumDo2 = mysql_real_escape_string($_GET['ObdobiDo2']);

$sql1 = "SELECT FaktSkup_II,NakupDatum,SUM(CenaCelkova) AS Cena FROM szm_data WHERE (NakupDatum BETWEEN '$DatumOd1' AND '$DatumDo1') GROUP BY FaktSkup_II ORDER BY FaktSkup_II";
?>
<table>
    <tr><th>Fakturační skupina</th><th>Celková cena (Kč)</th><th>Celková cena 2 (Kč)</th></tr>
    <?php
    $q1 = mysql_query($sql1) or die("CHYBA SQL - ".mysql_error());
    while ($r1 = mysql_fetch_array($q1)) {    
     ?>
        <tr><td><?php echo $r1['FaktSkup_II']; ?></td><td><?php echo $r1['Cena']; ?></td><td><?php echo $r1['Cena2']; ?></td></tr>
    <?php
    }
    ?>
</table>

Děkuji za každý nápad,co mě posune zase o krok dál;-)
Kajman
Profil
Po dotazu na řádku 8 si můžete udělat while cyklus, kdy projdete všechny řádky a uložíte si součty do pole. Stejně uděláte další období (nejlépe v cyklu nebo ve funkci, ať kód máte jenom jednou). Výpis tabulky pak uděláte z toho pole, kam jste si náskládal údaje z více dotazů.
andrstom
Profil
Kajman:
Dekuju za napovedu, avsak si nejsem uplne jisty jak to myslite...s while jem si uz pohraval, asi chybne - muzete mi to nastinit v mem prikladu? Nevim jestli jsem dobre vyjadril muj zamer...mel bych rad jeden sql dotaz (pokud to lze) do databaze, tak aby mi bylo vraceno: nazev skupiny,celkova cena nakoupeneho zbozi v obdobi1 a celkova cena nakoupeneho zbozi v obdobi 2.
_______________________________________________________________
| FaktSkup | CenaCelkova v obdobi 1 | CenaCelkova v obdobi 2 |
_______________________________________________________________
...
...
...
Kajman
Profil
andrstom:
mel bych rad jeden sql dotaz

Ano jde to i jedním dotazem... něco jako
SELECT FaktSkup_II,
       Coalesce(Sum(Cena1), 0) Cena1,
       Coalesce(Sum(Cena2), 0) Cena2
FROM   ((SELECT FaktSkup_II,
                Sum(CenaCelkova) AS Cena1,
                0                AS Cena2
         FROM   szm_data
         WHERE  ( NakupDatum BETWEEN '$DatumOd1' AND '$DatumDo1' )
         GROUP  BY FaktSkup_II)
        UNION ALL
        (SELECT FaktSkup_II,
                0                AS Cena1,
                Sum(CenaCelkova) AS Cena2
         FROM   szm_data
         WHERE  ( NakupDatum BETWEEN '$DatumOd2' AND '$DatumDo2' )
         GROUP  BY FaktSkup_II)) t
GROUP  BY FaktSkup_II
ORDER  BY FaktSkup_II 

Ale myslím, že přehlednější a obdobně rychlé by byly dva dotazy rovnající výsledky do dvourozměrného pole.
andrstom
Profil
Zkousim to zprovoznit, ale hazi mi to:
CHYBA SQL - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT FaktSkup_II, COALESCE(SUM(Cena1), 0) Cena1, COALESCE(SUM(Cena2), 0)' at line 1

Pokud bych se dal cestou dvou cyklu while, kterymi nanaplnim dvourozmerne pole - jak by to melo vypadat?
Predstavuji si to tak ze budou sql dotazy na kazde obdobi, ale pak bych se placal v naplneni a vypsani toho pole:-(
Prosim o radu
Kajman
Profil
andrstom:
Pokud bych se dal cestou dvou cyklu while, kterymi nanaplnim dvourozmerne pole - jak by to melo vypadat?

Něco jako

<?php
function szm_data_compare()
{
    //definice obdobi
    $obdobi = array(
        array(
            'napdis'=>'Celková cena (Kč)',
            'od'=>$_GET['ObdobiOd1'],
            'do'=>$_GET['ObdobiDo1']
            ),
        array('napdis'=>'Celková cena 2 (Kč)',
            'od'=>$_GET['ObdobiOd2'],
            'do'=>$_GET['ObdobiDo2']
            )
        );
    
    //misto pro docasne ukladani
    $soucty=array();
    $nadpisy='';
    
    //vysosani dat pro jednotlive obdobi
    foreach($obdobi as $idObodbi => $hodnoty )
    {
        $od = mysql_real_escape_string($hodnoty['od']);
        $do = mysql_real_escape_string($hodnoty['do']);
        $sql = "SELECT FaktSkup_II,
                Sum(CenaCelkova) AS Cena
                FROM   szm_data
                WHERE  ( NakupDatum BETWEEN '$od' AND '$do' )
                GROUP  BY FaktSkup_II
                ORDER  BY FaktSkup_II";
        $q = mysql_query($sql) or die("CHYBA SQL - ".mysql_error());
        while ($r = mysql_fetch_array($q)) {
            if(!isset($soucty[$r['FaktSkup_II']]))
            {
                $soucty[$r['FaktSkup_II']]=array();
            }
            $soucty[$r['FaktSkup_II']][$idObodbi]=$r['Cena'];
        }
        $nadpisy.='<th>'.htmlspecialchars($hodnoty['nadpis']).'</th>';
        mysql_free_result($q);
    }
    ksort($soucty);
    
    //vypsani do tabulky
    echo "<table><tr><th>Fakturační skupina</th>$nadpisy</tr>";
    foreach($soucty as $FaktSkup_II => $sloupce)
    {
        echo "<tr><td>".htmlspecialchars($FaktSkup_II)."</td>";
        foreach($obdobi as $idObodbi => $hodnoty )
        {
            echo "<td>".(isset($sloupce[$idObodbi])?htmlspecialchars($sloupce[$idObodbi]):0)."</td>";
        }
        echo "</tr>";
    }
    echo "</table>";
}

szm_data_compare();
?>
andrstom
Profil
waaauuu....tak tohle by mi dalo dost práce...díky moc. Jdu to zkusit zprovoznit;-)


Funguje přesně jak by mělo, jen se mi nezobrazovali nadpisy Celková cena (Kč) a Celková cena 2 (Kč) => v řádku 7 a 11 je překlep "napdis" místo "nadpis" (to jen kdyby to někdy někdo chtěl použít)

Mnohokrát děkuju za Váš čas;-)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0