Autor Zpráva
Andrej.B
Profil
Zdravim,

mam 2 tabulky:

balik
sklad_polozka




balik mam takyto:
(id_balik, id_middle, brutto)
balik (1,25,10)
balik (2,25,10)
balik (3,24,10)
balik (4,11,10)
balik (5,11,10)

sklad_polozka takto:
(id_sklad_polozka, mnozstvo_polozka, id_material, lot)
sklad_polozka (25,200,17,U155)
sklad_polozka (24,300,17,U199)
sklad_polozka (11,100,3,U200)


kde id_middle a id_sklad_polozka je vztah = cize to iste

Cize balik 1,2,3 je urobeny z toho isteho materialu 17 len z rozdielnych LOT/Batch.. Potrebujem si spocitat brutto (10,10,10) podla id_materialu bez ohladu na LOT

Vlastne spocitam mnozstvo_polozka (200+300) podla id_materialu (17) a odcitam vsetko brutto z balika (10+10+10) cize vysledok je 500-30 bez ohladu na LOT pre id_material 17

Vlastne spocitam mnozstvo_polozka (100) podla id_materialu (3) a odcitam vsetko brutto z balika (10+10) cize vysledok je 100-20 bez ohladu na LOT pre id_material 3

Nedokazem si to dopocitat .

Dokazem si spocitat brutto v balikoch podla id_middle:

<?php
$result = $conn -> query("SELECT SUM(brutto) as brutto, id_middle FROM balik WHERE aktivny_balik = '1' GROUP BY id_middle"); 
        while ($row = $result->fetch_array())
    {
         $brutto = $row['brutto'];
         $id_middle = $row['id_middle'];
    echo 'id - '.$id_middle;
    echo ': metre - '.$brutto;
    echo '<br>';
        
        
    }
?>

vysledok je
id - 24: metre - 10
id - 25: metre - 20

kedze viem ze tieto 24 a 25 su v sklad_polozka obe pod 17, rad by som spocital SUM tejto 17 (500) minus tych 30.. ale nejde mi to vobec... Tie LOT su dolezite aby sa vedelo z coho je vlatne ten balik zlozeny, material ten isty, len lot iny.

Diky za rady... aj take ci nemam pocitac radsej spalit :)
Ikki
Profil
Moc nechápu co vlastně chceš, ale jestli to dobře chápu, tak se snažíš dopočítat nějaké hodnoty, které je potřebné získat ze dvou tabulek, ale tvůj SQL dotaz obsahuje jen jednu. Možná už mi to nemyslí, ale nemůžu tu druhou tabulku nikde najít :D
Keeehi
Profil
Snad takto. Píši to z hlavy.
SELECT
    id_material,
    SUM(mnozstvo_polozka) - SUM(COALESCE(brutto_sum, 0)) AS available_material
FROM
    sklad_polozka
LEFT JOIN (
    SELECT
        SUM(brutto) AS brutto_sum,
        id_middle
    FROM
        balik
    GROUP BY
        id_middle
) AS t
ON sklad_polozka.id_sklad_polozka = t.id_middle
GROUP BY id_material
Andrej.B
Profil
Keeehi:

z hlavy? neskutocne... toto nieje moja salka kavy... vyskusam, ale bud to budem musiet nieco spravit inak, lebo takto to asi nedam :)
Diky

Ikki:
ono to je tam len jeden, bo dalej sa neviem pohnut :)


$result = $conn -> query
    ("
    SELECT
    id_material,
    SUM(mnozstvo_polozka) - SUM(COALESCE(brutto_sum), 0) AS available_material
FROM
    sklad_polozka
LEFT JOIN (
    SELECT
        SUM(brutto) AS brutto_sum,
        id_middle
    FROM
        balik
    GROUP BY
        id_middle
) AS t
ON sklad_polozka.id = t.id_middle
GROUP BY id_material

    "); 
echo " Error:  - " . $result . "" . mysqli_error($conn);

Vyhadzuje chyby:
Error: - 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 ' 0) AS available_material FROM sklad_polozka LEFT JOIN ( SELECT ' at line 3


AS available_material - to znamena ak tam mam aktivny_balik = '1' ?
brutto_sum - neviem kde sa to zobralo... asi z toho LEFT JOIN? Tento dotaz sa vykona ako prvy?
ON sklad_polozka.id = t.id_middle - sklad_polozka.id je odkial?

Netusim kde je sever. SKusam rozne obmeny kodu ale stale podobne chyby ako vyssie...
Dam asi otazku este raz aj s celymi tabulkami.
Kajman
Profil
Za prvním výskytem bruto_sum je závorka navíc. Zkuste ji smazat.
Keeehi
Profil
Kajman, Andrej.B:
Ne úplně navíc, ale na špatném místě. V původním příspěvku jsem to upravil.
+ úprava názvu sloupce z [#8]

Andrej.B:
z hlavy? neskutocne... toto nieje moja salka kavy.
Ta věta měla znamenat hlavně to, že jde o nezkoušený kód ve kterém mohou být větší či menší chyby. Ta závorka na špatném místě byl jen překlep. Přesto zrovna toto místo je část s kterou si nejsem úplně jistý.
Jde o to, že pokud bude existovat materiál na skladě ale ještě z něj nebyl vytvořen žádný balík, tak v brutto_sum bude NULL. Nevím, jak se MySQL staví ke sčítání čísel a NULL hodnot. MySQL je velmi benevolentní takže si myslím že NULL hodnoty by prostě ignorovalo ale jistý si tím nejsem. Takže jsem tam přidal pro jistotu právě COALESCE. To vrátí první neNULLovou hodnotu. Takže buď tu sumu nebo nulu z druhého parametru. Ovšem v tomto případě si zase nejsem jistý, zda se to dá použít takto nad agregovaným sloupcem. Pokid by to byl problém, tak se to dá rozložit na dotaz a poddotaz a v poddotaze provést nejdříve tu normalizaci NULL hodnot a agregaci až následně v dotazu.
Andrej.B
Profil
hm toto nepojde... musim pochopit, co to robi, chyba sa mi len posunula dalej o riadok...
Dam to znova a lepsie...

Data tabuliek

--
-- Štruktúra tabuľky pre tabuľku `balik`
--

CREATE TABLE `balik` (
  `datum_balik` int(11) NOT NULL,
  `id_balik` mediumint(9) NOT NULL,
  `id_vyrobna_zakazka` int(11) NOT NULL,
  `cislo_balik` tinyint(3) UNSIGNED ZEROFILL NOT NULL,
  `id_zakaznik` int(11) NOT NULL,
  `id_top` int(11) NOT NULL,
  `id_middle` int(11) NOT NULL,
  `id_down` int(11) NOT NULL,
  `brutto` float NOT NULL,
  `chyby` smallint(6) NOT NULL,
  `netto` float NOT NULL,
  `znacka` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `info` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `id_user` int(11) NOT NULL,
  `aktivny_balik` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Sťahujem dáta pre tabuľku `balik`
--

INSERT INTO `balik` (`datum_balik`, `id_balik`, `id_vyrobna_zakazka`, `cislo_balik`, `id_zakaznik`, `id_top`, `id_middle`, `id_down`, `brutto`, `chyby`, `netto`, `znacka`, `info`, `id_user`, `aktivny_balik`) VALUES
(1545067388, 1, 6001234, 001, 2, 37, 26, 58, 102, 2, 101.5, '', '', 4, 1),
(1545067399, 2, 6001234, 002, 2, 37, 25, 58, 56, 2, 55.5, '', '', 4, 1),
(1545067410, 3, 6001234, 003, 2, 37, 25, 58, 86, 2, 85.5, '', '', 4, 1);
(1545067555, 6, 6001222, 003, 2, 21, 24, 15, 20, 2, 19.5, '', '', 4, 1);
--
-- Štruktúra tabuľky pre tabuľku `sklad_polozka`
--

CREATE TABLE `sklad_polozka` (
  `id_sklad_polozka` int(11) NOT NULL,
  `id_material` int(11) NOT NULL,
  `id_druh_material` int(11) NOT NULL,
  `datum_sklad_polozka` int(11) DEFAULT NULL,
  `mnozstvo_polozka` int(11) NOT NULL,
  `cena_polozka` float NOT NULL,
  `dodaci_list` varchar(255) NOT NULL,
  `hmotnost` int(11) NOT NULL,
  `cislo_objednavky` varchar(255) DEFAULT NULL,
  `lot_material` varchar(255) NOT NULL,
  `id_user` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Sťahujem dáta pre tabuľku `sklad_polozka`
--

INSERT INTO `sklad_polozka` (`id_sklad_polozka`, `id_material`, `id_druh_material`, `datum_sklad_polozka`, `mnozstvo_polozka`, `cena_polozka`, `dodaci_list`, `hmotnost`, `cislo_objednavky`, `lot_material`, `id_user`) VALUES
(26, 17, 1, 1545067340, 500, 100, '10121', 100, '5468654', 'U520', 4),
(25, 17, 1, 1545067312, 100, 100, '10121', 10, '47575', 'U100', 4),
(24, 2, 1, 1544435534, 1500, 25, 'nebol', 2000, '7215489', 'U123', 4);

Robim si statistiku a zostatky materialov...

tabulka SKLAD_POLOZKA su prijate materialy ako chodili do skladu... Potrebujem si vytiahnut kolko sa minulo materialu na balik...
Mam spolu 600 metrov materialu v sklade z roznymi LOT podla id_material 17 ale v balikoch som to odrataval podla id_middle /balik/ = id_sklad_polozka /sklad_polozka/
Potrebujem to cele zoskupit tak aby mi to vyslo ze material s id_material 17 mam zostatok 600 /sum zo sklad_polozka / - baliky z id_middle 25 a 26 pretoze to je to co mam pri materialy 102, 56 a 86 takze vysledok:

Material 17 ma zostatok 356 /600-(102+56+86)/
Material 2 ma zostatok 1480 /1500-(20)/

Atd.

Alebo to prerobit nejako inak... Ide o to, ze je dolezite dohladat neskor presne LOT toho materialu. Operator si vybera pri odpisovani balika, ktory material dat s ktorym LOTkom cize ma na vyber 2 materialy, ktore su rovnake len iny lot...

Kukam na to, a asi to zmazem a dam vsetko nanovo, cele odvadzanie balikov... cele zle... zlaty excel :)
Kajman
Profil
V dotazu stačí upravit sklad_polozka.id na sklad_polozka.id_sklad_polozka a pak to funguje
sqlfiddle.com/#!9/9290b8/2
Andrej.B
Profil
Kajman, Keeehi:


unbelievable... ako? Robi to presne to, co potrebujem... Dakujem...
Cele to mal byt maly projekt pre jednoduchy sklad, ale postupne sa to rozrasta do obludy, ktoru bez pomoci neviem zvladnut...
Diky

<?php

     $result = $conn -> query
    ("
    SELECT
    id_material, 
    SUM(mnozstvo_polozka) - SUM(COALESCE(brutto_sum, 0)) AS available_material
FROM
    sklad_polozka
LEFT JOIN (
    SELECT
        SUM(brutto) AS brutto_sum,
        id_middle
    FROM
        balik
    GROUP BY
        id_middle
) AS t
ON sklad_polozka.id_sklad_polozka = t.id_middle
GROUP BY id_material
 
    "); 

 while ($row = $result->fetch_array()) 

 {
$result2 = $conn->query("SELECT * FROM sklad_material WHERE id_material = ".$row['id_material']."");
 while ($row2 = $result2->fetch_array()) {
     echo $row2['nazov_material'];
 }
echo ' - ';
echo $row['available_material'];
echo '<br>';
 }    
?>

Vysledok vypada takto:

Keeehi
Profil
Andrej.B:
Tak nebudu předstírat že s databázemi denně nepracuji a vím že Kajman je také nevidí poprvé. Ale zrovna tento dotaz není až tak složitý. Ono dost často jde jen o spojování tabulek a agregace. Jediné co je potřeba vymyslet je to, v jakém pořadí to udělat.

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:

0