Body zdarma Java týden
Využij podzimních slev a získej od nás až 40 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!

Diskuze: Celková suma

Aktivity (2)
Avatar
gorri
Člen
Avatar
gorri:10. května 10:51

Ahoj,
měl bych prosbu. Nevíte někdo jak si můžu z DB vypsat celkovou cenu? Chtěl jsem si napsat menší widget, který by mi po přihlášení hned zobrazil nové objednávky ale zároveň abych viděl i za kolik jsou celkem. Nicméně se mi to nedaří. Děkuji za případnou reakci a nakopnutí správným směrem.

Zkusil jsem:

SELECT SUM(cena) AS celkova_cena FROM produkty WHERE datum=?, date("Y-m-d")

Další vím, že byla hloupost ale zkusil jsem to taky.

SELECT COUNT(cena) FROM produkty WHERE datum=?, date("Y-m-d")

Chci docílit: Vypsat celkovou sumu.

Odpovědět 10. května 10:51
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na gorri
Daniel Vítek:10. května 11:09

Count ti vrátí počet řádků. Příkaz se SUM vypadá v pořádku. Není problém v tom, že ho pouštíš na produkty a ne na objednané produkty?

Pokud chceš v tomhle pomoct, dej sem alespoň nástřel struktury databáze.

Editováno 10. května 11:09
Nahoru Odpovědět  +1 10. května 11:09
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:10. května 11:10

Mozna by pomohlo GROUP BY a definovat propojeni radku.

 
Nahoru Odpovědět 10. května 11:10
Avatar
gorri
Člen
Avatar
Odpovídá na Daniel Vítek
gorri:10. května 11:13

Taky si myslím, že je v pořádku. DB u produktu vypadá následovně

datum
datum_a_cas
id_objednavky
nazev_objednavky
fakturacni_adresa
dorucovaci_adresa
cena
status

Tohle je vše co u objednávky mám.

Nahoru Odpovědět 10. května 11:13
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
Odpovídá na Peter Mlich
gorri:10. května 11:19

Tak nevím jestli jsem to nezadal špatně ale nefunguje

Db::query('SELECT SUM(cena) FROM objednavka WHERE datum=? GROUP BY cena', date("Y-m-d"))
Nahoru Odpovědět 10. května 11:19
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Michal Haňáček:10. května 11:28

Samozřejmě zadal. Klauzule GROUP BY a výčet atributů patří až za podmínku.

Nahoru Odpovědět 10. května 11:28
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
gorri
Člen
Avatar
Odpovídá na Michal Haňáček
gorri:10. května 11:37

Nejsem si jistý, že jsem tě pochopil správně. Pravdou je, že s SQL se stále učím ale i takový zápis nefunguje

Db::query('SELECT cena, SUM(cena) FROM objednavka WHERE datum=? GROUP BY ?',  date("Y-m-d"), 'cena')
Nahoru Odpovědět 10. května 11:37
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Tomáš Novotný:10. května 11:50

Ahoj a není tam spíše problém s datovým typem? Můžeš poslat alespoň strukturu tabulky, jak píše Daniel Vítek? Tj. něco v duchu

CREATE TABLE `dev` (
        `devID` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
        `key` VARCHAR(70) AS (concat(`nm`,'|',`sn`)) VIRTUAL,
        `descr` TINYTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
        `nm` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
        `sn` VARCHAR(19) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
        PRIMARY KEY (`devID`),
        INDEX `devID_key_nm_sn` (`devID`, `key`, `nm`, `sn`)
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB;
Editováno 10. května 11:52
Nahoru Odpovědět 10. května 11:50
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
gorri
Člen
Avatar
Odpovídá na Tomáš Novotný
gorri:10. května 11:54

Aha. Tak to se omlouvám.
Tady to je

CREATE TABLE IF NOT EXISTS `objednavka` (
`id` int(11) NOT NULL,
  `datum` date NOT NULL,
  `datum_a_cas` datetime NOT NULL,
  `id_objednavky` int(11) NOT NULL,
  `nazev` varchar(255) NOT NULL,
  `zakaznik` varchar(255) NOT NULL,
  `adresa_doruceni` text NOT NULL,
  `fakturacni_adresa` text NOT NULL,
  `cena` int(11) NOT NULL,
  `status` int(11) NOT NULL
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
Nahoru Odpovědět 10. května 11:54
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Tomáš Novotný:10. května 12:07

Ač by tvá tabulka chtěla některé úpravy, i v tomto stavu by SUMa měla fungovat. A zeptám se teď hloupě, jiné dotazy ti fungují? Mířím tím k tomu, zda ti funguje ten DB wrapper, který používáš. Je správně nastaven případně generuje validní DB dotazy?

Editováno 10. května 12:08
Nahoru Odpovědět 10. května 12:07
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Petr Langer
Člen
Avatar
Odpovídá na gorri
Petr Langer:10. května 12:08
SELECT SUM(cena)
FROM objednavka
WHERE datum = date("Y-m-d")
GROUP BY id

Tohle nefunguje?

 
Nahoru Odpovědět 10. května 12:08
Avatar
gorri
Člen
Avatar
Odpovídá na Tomáš Novotný
gorri:10. května 12:09

Zobrazování funguje. Vše funguje. Nad výpočtem jsou nové produkty a kolik jich je. To se zobrazuje.
Jen pro informaci. Jaké úpravy prosím myslíš? Rád se poučím. :-)
Děkuji

Nahoru Odpovědět 10. května 12:09
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
Odpovídá na Petr Langer
gorri:10. května 12:12

Bohužel ne
Takhle je to zapsané a nejde to. Upravil jsem jen podmínku pro datum

Db::query('SELECT SUM(cena)
FROM objednavka
WHERE datum = ?
GROUP BY id', date("Y-m-d"));
Nahoru Odpovědět 10. května 12:12
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Tomáš Novotný:10. května 12:15

Zkusil bych otestovat místo date("Y-m-d") tam dát přímo datum "2019-05-10"... nebo nějaký, který máš v DB

Nahoru Odpovědět 10. května 12:15
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Jaroslav Smrž
Redaktor
Avatar
Jaroslav Smrž:10. května 12:15

Ahoj, používám následující script. Pro úplnost přikládám i třídu s připojením.
sum.php

<?php

include_once('connection.php');

$database = new Connection();
$db = $database->open();
try {
    $sql = "SELECT sum(fin_castka) as total FROM finance";
    $query = $db->query($sql);
    $row = $query->fetch(PDO::FETCH_ASSOC);
    if ($row) {
        $sum = $row['total'];
    }
} catch (PDOException $e) {
    echo "Oooops! Našel se problém s připojením k databázi: " . $e->getMessage();
}
$database->close();

connection.php

<?php

Class Connection {

    private $server = "mysql:host=localhost;dbname=is";
    private $username = "root";
    private $password = "";
    private $options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,);
    protected $conn;

    public function open() {
        try {
            $this->conn = new PDO($this->server, $this->username, $this->password, $this->options);
            return $this->conn;
        } catch (PDOException $e) {
            echo "Ooops... Spojení nelze navázat: " . $e->getMessage();
        }
    }

    public function close() {
        $this->conn = null;
    }
}
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 10. května 12:15
/* Life runs on code */
Avatar
Petr Langer
Člen
Avatar
Odpovídá na gorri
Petr Langer:10. května 12:20

Tak jsem si to teď vyzkoušel a s GROUP BY mi to taky nefunguje, což mi přijde divné. Bez něj to funguje.

 
Nahoru Odpovědět 10. května 12:20
Avatar
gorri
Člen
Avatar
Odpovídá na Tomáš Novotný
gorri:10. května 12:21

Nefunguje ani tak

Nahoru Odpovědět 10. května 12:21
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
Odpovídá na Petr Langer
gorri:10. května 12:22

Pošli prosím jak to v PHP zobrazuješ.

Nahoru Odpovědět 10. května 12:22
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Jaroslav Smrž
Redaktor
Avatar
Odpovídá na gorri
Jaroslav Smrž:10. května 12:23

Stačí v sum.php změnit $sql, v connection.php zas přístupy, doplnit WHERE a mělo by ti vše fungovat. Pokud budeš mít otázky ke kódu, tak rád vysvětlím, ale myslím, že by mělo být vše jasné.

Nahoru Odpovědět 10. května 12:23
/* Life runs on code */
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:10. května 12:23

(priklad, se sum a group)
google = mysql group by
https://dev.mysql.com/…difiers.html

SELECT year, country, product, SUM(profit) AS profit
       FROM sales
       GROUP BY year, country, product WITH ROLLUP

https://www.tutorialspoint.com/…y-clause.htm

(se ti pokouseli rici ostatni, ze se where pise az za group)
google = mysql group by where
https://stackoverflow.com/…up-by-clause

SELECT  Service_ID, Service_Type, SUM(consumer_feedback)
FROM consumer9
GROUP BY Service_ID
WHERE Service_Type=Printer;

Mno, a tez se te ptaji, zda ti to spravne preklada dotazy z te otaznikove formy na sql dotaz. Pripadne si dej vypsat sql errory. Nejspis mas globalne potlacene chybove hlasky nebo tam nemas prikaz, aby zobrazil sql error. Takhle to vypada, ze se spatne posklada sql prikaz. Pripadne by sis mohl vypsat poskladany sql dotaz na obrazovku, jestli to ten program umoznuje a zkopirovat jej do phpmyadmina, jestli funguje nebo jaky error phpmyadmin vypise.

 
Nahoru Odpovědět 10. května 12:23
Avatar
Odpovídá na gorri
Tomáš Novotný:10. května 12:24

Ok, tak je potřeba se podívat spíše na třídu Db.php... patrně se to zapisuje jinak. Zkus přiložit spíše jako soubor.

Nahoru Odpovědět 10. května 12:24
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:10. května 12:26

Jo, a tez pro GROUP plati, ze bys ten samy sloupec mel mit v SELECT, tusim. Nebo mozna v nejake exoticke db jako oracle ci mssql je to nutne, nevim.

 
Nahoru Odpovědět 10. května 12:26
Avatar
gorri
Člen
Avatar
gorri:10. května 12:31

A není jen problém, že to píšu

Db::query('SELECT.....)

Myslím to Db::query. Jestli se to nezapisuje jinak?

Nahoru Odpovědět 10. května 12:31
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Tomáš Novotný:10. května 12:33

:-) no však sem plácni ten Db.php... v něm bude vidět jak se to má zapsat, aby ti to vyrobilo validní SQL dotaz...

Editováno 10. května 12:34
Nahoru Odpovědět  +1 10. května 12:33
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:10. května 12:38

Vsichni ti porad rikame, ze nevidime do tve knihovny na db, viz Tomas, musel bys dat jeji kod. Nebo si k ni najdi manual, tam bude jiste par prikladu, jak se to spravne zapisuje, abys spustil sql dotaz s otazniky a normalni.

A priklad od Jaroslav Smrž ti nefunguje? Nebo jej neumis upravit pro tve sql pripojeni? Jestli by nebylo jednodussi pouzivat jeho kod nez tridu, ve ktere se nevyznas.

 
Nahoru Odpovědět  +1 10. května 12:38
Avatar
gorri
Člen
Avatar
gorri:10. května 12:46

SQL dotaz normálně spustím. Vše mi běží normálně. To je divné. Nicméně Db.php je místní.
Příklad od Jaroslav Smrž teď zkouším.

Nahoru Odpovědět 10. května 12:46
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Jaroslav Smrž
Redaktor
Avatar
Odpovídá na gorri
Jaroslav Smrž:10. května 12:50

Pro jistotu dodám, že si musíš soubor sum.php requirovat v šabloně a total vypíšeš pomocí

<?php echo $sum; ?>
Nahoru Odpovědět 10. května 12:50
/* Life runs on code */
Avatar
gorri
Člen
Avatar
Odpovídá na Jaroslav Smrž
gorri:10. května 12:54

Děkuji. Jde mi to vypsat. Nicméně mi bych potřeboval aby tam byly data jen za dnešní den.
Zkusil jsem provést úpravu

$query = $db->query('SELECT SUM(cena) AS total FROM objednavka WHERE datum=?',date("Y-m-d");

a chyba.

Jinak příkaz date("Y-m-d") mi funguje normálně. Pár řádku zpět mám napsané Počet objednávek a to jede.

Editováno 10. května 12:54
Nahoru Odpovědět 10. května 12:54
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Jaroslav Smrž
Redaktor
Avatar
Odpovídá na gorri
Jaroslav Smrž:10. května 12:57

Tak to je jasné, že to takhle nepůjde. Máš úplně špatně závorky a uvozovky...

Nahoru Odpovědět 10. května 12:57
/* Life runs on code */
Avatar
gorri
Člen
Avatar
Odpovídá na Jaroslav Smrž
gorri:10. května 13:00

Máš recht. Díky za opravu. Nicméně i tak nic.

$query = $db->query("SELECT SUM(cena) AS total FROM objednavka WHERE datum=?",  date("Y-m-d"));
Editováno 10. května 13:01
Nahoru Odpovědět 10. května 13:00
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Jaroslav Smrž
Redaktor
Avatar
Odpovídá na gorri
Jaroslav Smrž:10. května 13:01

Počkej, kam to píšeš vůbec? SQL dotaz musíš zapsat do proměnné $sql např.

$sql = "SELECT sum(fin_castka) as totalprijem FROM finance WHERE fin_typ='PŘÍJEM'";

pak až následuje

$query = $db->query($sql);
Editováno 10. května 13:02
Nahoru Odpovědět  -1 10. května 13:01
/* Life runs on code */
Avatar
gorri
Člen
Avatar
Odpovídá na Jaroslav Smrž
gorri:10. května 13:06

No takhle jsem to zrovna zapisovat nechtěl ale funguje to. Myslím, že není ani dobré to takhle zapisovat. Podle toho co jsem četl atd.
Nicméně to funguje. Děkuji

Nahoru Odpovědět 10. května 13:06
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Jaroslav Smrž
Redaktor
Avatar
Odpovídá na gorri
Jaroslav Smrž:10. května 13:10

Jak není dobré takhle zapisovat??? To fakt nechápu. Do proměnné $sql uložíš dotaz, a ten pak zpracuješ pomocí instance v Connection.php. Víš vůbec jak funguje PDO a objekty? No nic, jestli ti to funguje, tak OK, ale měl bys trochu nastudovat základy OOP.

Nahoru Odpovědět 10. května 13:10
/* Life runs on code */
Avatar
gorri
Člen
Avatar
Odpovídá na Jaroslav Smrž
gorri:10. května 13:16

V pohodě. Nechtěl jsem se tě nějak dotknout. Faktem je, že OOP jsem si moc neprostudoval. Nějakou dobu se k tomu už chystám.
Každopádně děkuji za řešení.

Nahoru Odpovědět 10. května 13:16
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:10. května 13:20

Pokud informace mas k clanku a nepridas odkaz, tak sorac. Ja zadny clanek tady necetl, takze stale nevim, jak vypada class pro db :)

Ono se to treba nepises s carkou, jak to mas, ale parametry se davaji treba zvlast prikazem.

$query = $db->query("SELECT SUM(cena) AS total FROM objednavka WHERE datum=?");
$query->addParam(date("Y-m-d"))
 
Nahoru Odpovědět 10. května 13:20
Avatar
Odpovídá na gorri
Tomáš Novotný:10. května 13:20

Takže pokud používáš místní db wrapper nad pdo tak by se dala použít třeba tato statická metoda:

$db = Db::queryOne('SELECT SUM(cena) AS total FROM objednavka WHERE datum=?', date("Y-m-d"));
echo $db['total'];
Nahoru Odpovědět  +1 10. května 13:20
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Jaroslav Smrž
Redaktor
Avatar
Odpovídá na gorri
Jaroslav Smrž:10. května 13:21

V pohodě, není za co. Já jen že PDO ovladač je o dost dál než bylo třeba Mysqlli. Asi si nejspíš myslel vkládání proměnných do dotazu, to je ale něco trochu jiného než vložení dotazu do proměnné. Zkus na PDO kouknout třeba na www.php.net

Nahoru Odpovědět 10. května 13:21
/* Life runs on code */
Avatar
gorri
Člen
Avatar
Odpovídá na Tomáš Novotný
gorri:10. května 13:27

Péééécka. Toto jsem hledal. Takže jsem měl jen chybný zápis. Zkoušel jsem i

Db::queryOne(.....)

ale zobrazoval jsem si vždycky

echo ($promena['cena']);
Nahoru Odpovědět 10. května 13:27
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
Odpovídá na Jaroslav Smrž
gorri:10. května 13:33

Jo to jsem měl namysli. No budu se muset na OOP podívat. Každopádně díky.

Nahoru Odpovědět 10. května 13:33
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na Jaroslav Smrž
Daniel Vítek:11. května 18:05

Jaký je prosím rozdíl mezi:

$sql = "SELECT sum(fin_castka) as totalprijem FROM finance WHERE fin_typ='PŘÍJEM'";
$query = $db->query($sql);

a

$query = $db->query("SELECT sum(fin_castka) as totalprijem FROM finance WHERE fin_typ='PŘÍJEM'");
Nahoru Odpovědět 11. května 18:05
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
Jaroslav Smrž
Redaktor
Avatar
Odpovídá na Daniel Vítek
Jaroslav Smrž:11. května 18:49

Při výpisu dat z DB žádný.

Nahoru Odpovědět 11. května 18:49
/* Life runs on code */
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na Jaroslav Smrž
Daniel Vítek:11. května 19:16

V tom případě nechápu tvůj komentář na který odpovídám :)

Nahoru Odpovědět 11. května 19:16
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 42 zpráv z 42.