Databáze > MySQL

dotaz nad mé síly

(1/3) > >>

Vladimir64:
Dobrý den, potřebuji vypočítat produkci jednotlivých oddělení po jednotlivých dnech, v tabulce jsou uvedena čísla kusů (jedná se o produkci textilního závodu). Čísla jsou unikátní. Dále čísla strojů, délku kusů v metrech, datum a čas kdy byl kus zpracován.

piece - číslo kusu ve formátu varchar(15)
mydate - datum kdy byl kus zpracován ve formátu date
mytime - čas kdy byl kus zpracováván ve formátu time
m - délka kusu v metrech ve formátu float

dále @specific_date je datum který zadávám na začátku dotazu a je to datum za který počítám produkci


Oddělení které počítám má několik strojů ale některé z nich mají více částí. V případě, že má stroj víc částí je v tabulce i víc záznamů. Každý záznam má ale stejné číslo stroje. Je vcelku jednoduché zjistit jestli na tom stroji ten kus už jednou byl a pokud ano podruhé ho nezapočítávat (nechci mít v produkci trojnásobné metry, pokud jeden a ten stejný kus prochází 3 částmi stejného stroje). Problém je v tom, že v technologických postupech existuje i varianta, kdy kus skutečně prochází strojem vícekrát (včetně jeho jednotlivých částí) Chci pro rozlišení toho jestli se jedná o jeden průchod (i když více částmi) nebo vícenásobný průchod, využít čas kdy daný kus byl zpracováván. Pokud tedy je ten kus na stejném stroji během jedné hodiny,nezapočítávat, je to v rámci jednoho průchodu strojem, pokud ale je časový rozdíl větší než 1 hodina započítávat. V tom případě se jedná skutečně o vícenásobný průchod strojem.
Vytvořil jsem dotaz kde vytvářím přechodnou tabulku temp_results, kam ukládám do jednotlivých řádků výsledky jednotlivých oddělení, nakonec to vyexportuji v textovém souboru a přechodnou tabulku smažu. Všechno funguje jen s tím jedním oddělením zápasím už celý den.

toto nepracuje korektně (na oddělení jsou 3 stroje s čísly 1001, 1002 a 1005) jen stroje 1001 a 1002 mají víc částí.

INSERT INTO temp_results (row_data)
SELECT CONCAT(@custom_text6, ';', REPLACE(FORMAT(SUM(m), 0), ',', ' '))
FROM (
    SELECT a.piece,
           CASE
               WHEN a.machine = '1005' THEN SUM(a.m)
               WHEN a.machine IN ('1001', '1002') THEN
                    CASE
                        WHEN (
                            SELECT TIMESTAMPDIFF(HOUR, MAX(CONCAT(b.mydate, ' ', b.mytime)), MAX(CONCAT(a.mydate, ' ', a.mytime)))
                            FROM av50 AS b
                            WHERE b.piece = a.piece AND b.machine IN ('1001', '1002') AND DATE(b.mydate) < @specific_date
                        ) > 1 THEN SUM(a.m)
                        ELSE 0
                    END
               ELSE 0
           END AS m
    FROM av50 AS a
    WHERE DATE(a.mydate) = @specific_date AND a.machine IN ('1001', '1002', '1005')
    GROUP BY a.piece, a.machine
) AS subquery
GROUP BY DATE(@specific_date);

najde se někdo kdo to dá na první dobrou? Snažil bych se dál, jen čas kdy to musím mít hotové se neúprosně blíží.

Jan Fiala:
jen tak na první pohled tam vidím problem:

--- Kód: ---CASE
                        WHEN (
                            SELECT TIMESTAMPDIFF(HOUR, MAX(CONCAT(b.mydate, ' ', b.mytime)), MAX(CONCAT(a.mydate, ' ', a.mytime)))
                            FROM av50 AS b
                            WHERE b.piece = a.piece AND b.machine IN ('1001', '1002') AND DATE(b.mydate) < @specific_date
                        ) > 1 THEN SUM(a.m)
                        ELSE 0
                    END
--- Konec kódu ---

Kdyz je rozdil vic jak hodinu, tak spocitas, jinak davas natvrdo nulu a pritom bys mel pocitat jen ten jeden pruchod

Druhy problem, v tom subselectu mas DATE(b.mydate) < @specific_date a podle mne by tam melo byt DATE(b.mydate) = @specific_date

Jan Fiala:
Zkus na to jit z druhe strany. Sectes vse a odectes od toho pripady, kdy se vejdes do hodiny. Doufam, ze MySQL umi Left Outer Join. Ten se napoji jen, pokud je splnena podminka, jinak vraci null


--- Kód: ---select a.machine, a,piece, sum(a.m - IfNull(b.m, 0))
from av50 as a
left outer join av50 as b on a.piece = b.piece and (a.machine <> '1005') and  TIMESTAMPDIFF(HOUR, MAX(CONCAT(b.mydate, ' ', b.mytime)), MAX(CONCAT(a.mydate, ' ', a.mytime))) < 1   
where DATE(a.mydate) = @specific_date AND a.machine IN ('1001', '1002', '1005')
GROUP BY a.piece, a.machine

--- Konec kódu ---

Omlouvam se, pisu to z hlavy

Vladimir64:
proč se omlouváš? Kéž bych já dokázal napsat složitý dotaz jen tak z hlavy. Já ho pracně skládám po částech, často způsobem pokus - omyl. Snad mě ale omlouvá, že nejsem IT profesionál jako mnozí na tomto fóru a s databázemi si zatím moc netykám. Stáhnu ze serveru aktuální data a jdu to vyzkoušet. Zatím díky. Dám vědět jak jsem dopadl.

Jan Fiala:
Jeste z te join podminky vyluc pripady, kdy je cas stejny (pridej and a.cas <> b.cas), at ti tam neco zustane

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi