Avatar billede lsskaarup Nybegynder
19. september 2006 - 15:22 Der er 14 kommentarer og
1 løsning

Antal ordrer over deadline

Jeg har en ordre-db, som jeg skal lave noget data udtræk på. Jeg har 4 deadlines, og 4 reelt udførte deadlines, alle felter som date.

Jeg skal nu have udtrukket data om hvor mange procent ordre der overskrider de forskellige deadlines over de forskellige måneder. Kan man det direkte i MySQL eller skal jeg hive det over i php, som intranet-systemet er kodet i?
Avatar billede arne_v Ekspert
20. september 2006 - 04:11 #1
SELECT IF(actual>planned,1,0),COUNT(*) FROM tabel GROUP BY IF(actual>planned,1,0)

måske
Avatar billede lsskaarup Nybegynder
20. september 2006 - 12:18 #2
Det vil jeg lige prøve at se på.
Avatar billede lsskaarup Nybegynder
20. september 2006 - 13:50 #3
Bare lige så jeg er helt med. Jeg får følgende resultat, hvis jeg skyder den afsted mod DB'en:

actual = r542a
planned = r576

IF(r542a>r576,1,0) | COUNT(*)
      0            |  1380
      1            |    312

Betyder det, at der er 312 ordre, hvor datoen i r542a har overskredet deadlinen i r576?
Avatar billede lsskaarup Nybegynder
20. september 2006 - 16:08 #4
Det har jeg selv fundet ud af at det er, men jeg skal bruge lidt hjælp til at udfærdige sætningen, da den jeg har lavet ikke helt returnerer det jeg regner med.

For nemhedsskyld så lad os kalde datoerne for a1-a4 og p1-p4.
Avatar billede lsskaarup Nybegynder
20. september 2006 - 16:27 #5
Hmm, måske giver den et korrekt billede alligevel, jeg prøvede at skyde en masse querys afsted, hvor jeg via WHERE spørger på hver enkelt mulighed, og den gav andre resultater på de "falske" dele af IF-sætningerne.

Tilgengæld kommer det samlede antal ordre ikke op på det antal som der er i tabellen, men det gør det i min IF-query.

Så slår det mig, hvordan reagere de to i forhold til hinanden, hvis datofeltet indeholder NULL, 0000-00-00 eller "". Jeg fandt lige ud af at 2 af felterne ikke er date men text, derfor findes NULL og "".

Hvis IF bare ikke tolker dem som falske positive, så kan jeg stadig bruge resultatet.
Avatar billede kjulius Novice
20. september 2006 - 20:36 #6
Du kunne jo også gøre det som

SELECT SUM(IF(r542a>r576,1,0)) AS notOnTime, SUM(IF(r542a<=r576,1,0)) AS onTime
FROM dintabel

På den måde virker SUM funktionerne som en COUNT, da de summerer enten 1 eller 0.

Det giver mulighed for at få alle resultaterne præsenteret på én række. Somme tider er det en fordel i forhold til et gitter (eller hvad man nu kalder det :-).
Avatar billede lsskaarup Nybegynder
20. september 2006 - 22:07 #7
Hmm, måske skulle jeg ligge koden op.

kjulius -> Det er vidst et spørgsmål om overbevisning, hvilken metode man bedst kan lide, men mindre din da er meget hurtigere for sql'en.

SELECT If (r542a > r576
,
    If (r543a > r577
    ,
        If (r544a > r578
        ,
            If (r550a > r578a
            ,
                'Alle overskredet'
            ,
                'Statik-optegn-godk'
            )
        ,

            If (r550a > r578a
            ,
                'Statik-optegn-levering'
            ,
                'Statik-optegn'
            )
        )
    ,

        If (r544a > r578
        ,
            If (r550a > r578a
            ,
                'Statik-godk-levering'
            ,
                'Statik-godk'
            )
        ,

            If (r550a > r578a
            ,
                'Statik-levering'
            ,
                'Statik'
            )
        )
    )
,

    If (r543a > r577
    ,
        If (r544a > r578
        ,
            If (r550a > r578a
            ,
                'optegn-godk-levering'
            ,
                'optegn-godk'
            )
        ,

            If (r550a > r578a
            ,
                'optegn-levering'
            ,
                'optegn'
            )
        )
    ,

        If (r544a > r578
        ,
            If (r550a > r578a
            ,
                'godk-levering'
            ,
                'godk'
            )
        ,

            If (r550a > r578a
            ,
                'levering'
            ,
                'Ingen'
            )
        )
    )
) as test, count(*) from ordre5 group by
If (r542a > r576
,
    If (r543a > r577
    ,
        If (r544a > r578
        ,
            If (r550a > r578a
            ,
                'Alle overskredet'
            ,
                'Statik-optegn-godk'
            )
        ,

            If (r550a > r578a
            ,
                'Statik-optegn-levering'
            ,
                'Statik-optegn'
            )
        )
    ,

        If (r544a > r578
        ,
            If (r550a > r578a
            ,
                'Statik-godk-levering'
            ,
                'Statik-godk'
            )
        ,

            If (r550a > r578a
            ,
                'Statik-levering'
            ,
                'Statik'
            )
        )
    )
,

    If (r543a > r577
    ,
        If (r544a > r578
        ,
            If (r550a > r578a
            ,
                'optegn-godk-levering'
            ,
                'optegn-godk'
            )
        ,

            If (r550a > r578a
            ,
                'optegn-levering'
            ,
                'optegn'
            )
        )
    ,

        If (r544a > r578
        ,
            If (r550a > r578a
            ,
                'godk-levering'
            ,
                'godk'
            )
        ,

            If (r550a > r578a
            ,
                'levering'
            ,
                'Ingen'
            )
        )
    )
)
Avatar billede kjulius Novice
20. september 2006 - 23:03 #8
Teoretisk set burde min vel være lidt hurtigere, da der ikke er behov for nogen gruppering og sortering, men som du også anfører, så er formatet en smagssag:

SELECT
SUM(IF(r542a > r576 AND r543a > r578 AND r544a > r578 AND r550a > r578, 1, 0)) AS Alle_overskredet,
SUM(IF(r542a > r576 AND r543a > r578 AND r544a > r578 AND r550a <= r578, 1, 0)) AS Statik_optegn_godk,

SUM(IF(r542a > r576 AND r543a > r578 AND r544a <= r578 AND r550a > r578, 1, 0)) AS Statik_optegn_levering,
SUM(IF(r542a > r576 AND r543a > r578 AND r544a <= r578 AND r550a <= r578, 1, 0)) AS Statik_optegn,


SUM(IF(r542a > r576 AND r543a <= r578 AND r544a > r578 AND r550a > r578, 1, 0)) AS Statik_godk_levering,
SUM(IF(r542a > r576 AND r543a <= r578 AND r544a > r578 AND r550a <= r578, 1, 0)) AS Statik_godk,

SUM(IF(r542a > r576 AND r543a <= r578 AND r544a <= r578 AND r550a > r578, 1, 0)) AS Statik_levering,
SUM(IF(r542a > r576 AND r543a <= r578 AND r544a <= r578 AND r550a <= r578, 1, 0)) AS Statik,



SUM(IF(r542a <= r576 AND r543a > r578 AND r544a > r578 AND r550a > r578, 1, 0)) AS Optegn_godk_levering,
SUM(IF(r542a <= r576 AND r543a > r578 AND r544a > r578 AND r550a <= r578, 1, 0)) AS Optegn_godk,

SUM(IF(r542a <= r576 AND r543a > r578 AND r544a <= r578 AND r550a > r578, 1, 0)) AS Optegn_levering,
SUM(IF(r542a <= r576 AND r543a > r578 AND r544a <= r578 AND r550a <= r578, 1, 0)) AS Optegn,


SUM(IF(r542a <= r576 AND r543a <= r578 AND r544a > r578 AND r550a > r578, 1, 0)) AS Godk_levering,
SUM(IF(r542a <= r576 AND r543a <= r578 AND r544a > r578 AND r550a <= r578, 1, 0)) AS Godk,

SUM(IF(r542a <= r576 AND r543a <= r578 AND r544a <= r578 AND r550a > r578, 1, 0)) AS Levering,
SUM(IF(r542a <= r576 AND r543a <= r578 AND r544a <= r578 AND r550a <= r578, 1, 0)) AS Ingen



FROM ordre5
Avatar billede kjulius Novice
20. september 2006 - 23:25 #9
Jeg ser lige, at jeg vist ikke har fået feltnavnene helt rigtige. Felterne på højre side af sammenligningerne er sat til r578 for de sidste tre sammenligninger, selv om de skulle have været hhv. r577, r578 og r578a.

SELECT
SUM(IF(r542a > r576 AND r543a > r577 AND r544a > r578 AND r550a > r578a, 1, 0)) AS Alle_overskredet,
SUM(IF(r542a > r576 AND r543a > r577 AND r544a > r578 AND r550a <= r578a, 1, 0)) AS Statik_optegn_godk,

SUM(IF(r542a > r576 AND r543a > r577 AND r544a <= r578 AND r550a > r578a, 1, 0)) AS Statik_optegn_levering,
SUM(IF(r542a > r576 AND r543a > r577 AND r544a <= r578 AND r550a <= r578a, 1, 0)) AS Statik_optegn,


SUM(IF(r542a > r576 AND r543a <= r577 AND r544a > r578 AND r550a > r578a, 1, 0)) AS Statik_godk_levering,
SUM(IF(r542a > r576 AND r543a <= r577 AND r544a > r578 AND r550a <= r578a, 1, 0)) AS Statik_godk,

SUM(IF(r542a > r576 AND r543a <= r577 AND r544a <= r578 AND r550a > r578a, 1, 0)) AS Statik_levering,
SUM(IF(r542a > r576 AND r543a <= r577 AND r544a <= r578 AND r550a <= r578a, 1, 0)) AS Statik,



SUM(IF(r542a <= r576 AND r543a > r577 AND r544a > r578 AND r550a > r578a, 1, 0)) AS Optegn_godk_levering,
SUM(IF(r542a <= r576 AND r543a > r577 AND r544a > r578 AND r550a <= r578a, 1, 0)) AS Optegn_godk,

SUM(IF(r542a <= r576 AND r543a > r577 AND r544a <= r578 AND r550a > r578a, 1, 0)) AS Optegn_levering,
SUM(IF(r542a <= r576 AND r543a > r577 AND r544a <= r578 AND r550a <= r578a, 1, 0)) AS Optegn,


SUM(IF(r542a <= r576 AND r543a <= r577 AND r544a > r578 AND r550a > r578a, 1, 0)) AS Godk_levering,
SUM(IF(r542a <= r576 AND r543a <= r577 AND r544a > r578 AND r550a <= r578a, 1, 0)) AS Godk,

SUM(IF(r542a <= r576 AND r543a <= r577 AND r544a <= r578 AND r550a > r578a, 1, 0)) AS Levering,
SUM(IF(r542a <= r576 AND r543a <= r577 AND r544a <= r578 AND r550a <= r578a, 1, 0)) AS Ingen



FROM ordre5
Avatar billede lsskaarup Nybegynder
21. september 2006 - 10:19 #10
Ja, den er umiddelbart mere overskuelig, det næste er så at den også skal gruppere for hver måned inden for ét regnskabsår.

Jeg tror dog jeg har løst det via group by månedsfeltet, så mangler kun lige årstallet. Men måske vil resultatet også være mere overskueligt i din, kjulius.
Avatar billede lsskaarup Nybegynder
21. september 2006 - 11:22 #11
Øh, hvordan skal jeg group by, på din kjulius? Får hele tiden en sql-fejl
Avatar billede kjulius Novice
21. september 2006 - 13:14 #12
Der burde ikke være nogen problemer med at lave en gruppering på et månedsfelt. Noget ala det her burde virke:

SELECT year(logdate) as aar, month(logdate) as maaned,
SUM(IF(r542a > r576 AND r543a > r577 AND r544a > r578 AND r550a > r578a, 1, 0)) AS Alle_overskredet,
SUM(IF(r542a > r576 AND r543a > r577 AND r544a > r578 AND r550a <= r578a, 1, 0)) AS Statik_optegn_godk,

SUM(IF(r542a > r576 AND r543a > r577 AND r544a <= r578 AND r550a > r578a, 1, 0)) AS Statik_optegn_levering,
SUM(IF(r542a > r576 AND r543a > r577 AND r544a <= r578 AND r550a <= r578a, 1, 0)) AS Statik_optegn,


SUM(IF(r542a > r576 AND r543a <= r577 AND r544a > r578 AND r550a > r578a, 1, 0)) AS Statik_godk_levering,
SUM(IF(r542a > r576 AND r543a <= r577 AND r544a > r578 AND r550a <= r578a, 1, 0)) AS Statik_godk,

SUM(IF(r542a > r576 AND r543a <= r577 AND r544a <= r578 AND r550a > r578a, 1, 0)) AS Statik_levering,
SUM(IF(r542a > r576 AND r543a <= r577 AND r544a <= r578 AND r550a <= r578a, 1, 0)) AS Statik,



SUM(IF(r542a <= r576 AND r543a > r577 AND r544a > r578 AND r550a > r578a, 1, 0)) AS Optegn_godk_levering,
SUM(IF(r542a <= r576 AND r543a > r577 AND r544a > r578 AND r550a <= r578a, 1, 0)) AS Optegn_godk,

SUM(IF(r542a <= r576 AND r543a > r577 AND r544a <= r578 AND r550a > r578a, 1, 0)) AS Optegn_levering,
SUM(IF(r542a <= r576 AND r543a > r577 AND r544a <= r578 AND r550a <= r578a, 1, 0)) AS Optegn,


SUM(IF(r542a <= r576 AND r543a <= r577 AND r544a > r578 AND r550a > r578a, 1, 0)) AS Godk_levering,
SUM(IF(r542a <= r576 AND r543a <= r577 AND r544a > r578 AND r550a <= r578a, 1, 0)) AS Godk,

SUM(IF(r542a <= r576 AND r543a <= r577 AND r544a <= r578 AND r550a > r578a, 1, 0)) AS Levering,
SUM(IF(r542a <= r576 AND r543a <= r577 AND r544a <= r578 AND r550a <= r578a, 1, 0)) AS Ingen



FROM ordre5
WHERE logdate BETWEEN fiscalstart AND fiscalend
GROUP BY year(logdate), month(logdate)
Avatar billede lsskaarup Nybegynder
21. september 2006 - 20:54 #13
Okay, nu har jeg set outputtet fra sql'en også, og så mener jeg ikke der er noget at diskutere, kjulius din løsning er den bedste og mest overskuelige.

Jeg har lige tilpasset den til mine felter, så den ender med at se sådanne nu:
SELECT month(r572a) as maaned,
SUM(IF(r542a > r576 AND r543a > r577 AND r544a > r578 AND r550a > r578a, 1, 0)) AS Alle_overskredet,
SUM(IF(r542a > r576 AND r543a > r577 AND r544a > r578 AND r550a <= r578a, 1, 0)) AS Statik_optegn_godk,

SUM(IF(r542a > r576 AND r543a > r577 AND r544a <= r578 AND r550a > r578a, 1, 0)) AS Statik_optegn_levering,
SUM(IF(r542a > r576 AND r543a > r577 AND r544a <= r578 AND r550a <= r578a, 1, 0)) AS Statik_optegn,


SUM(IF(r542a > r576 AND r543a <= r577 AND r544a > r578 AND r550a > r578a, 1, 0)) AS Statik_godk_levering,
SUM(IF(r542a > r576 AND r543a <= r577 AND r544a > r578 AND r550a <= r578a, 1, 0)) AS Statik_godk,

SUM(IF(r542a > r576 AND r543a <= r577 AND r544a <= r578 AND r550a > r578a, 1, 0)) AS Statik_levering,
SUM(IF(r542a > r576 AND r543a <= r577 AND r544a <= r578 AND r550a <= r578a, 1, 0)) AS Statik,



SUM(IF(r542a <= r576 AND r543a > r577 AND r544a > r578 AND r550a > r578a, 1, 0)) AS Optegn_godk_levering,
SUM(IF(r542a <= r576 AND r543a > r577 AND r544a > r578 AND r550a <= r578a, 1, 0)) AS Optegn_godk,

SUM(IF(r542a <= r576 AND r543a > r577 AND r544a <= r578 AND r550a > r578a, 1, 0)) AS Optegn_levering,
SUM(IF(r542a <= r576 AND r543a > r577 AND r544a <= r578 AND r550a <= r578a, 1, 0)) AS Optegn,


SUM(IF(r542a <= r576 AND r543a <= r577 AND r544a > r578 AND r550a > r578a, 1, 0)) AS Godk_levering,
SUM(IF(r542a <= r576 AND r543a <= r577 AND r544a > r578 AND r550a <= r578a, 1, 0)) AS Godk,

SUM(IF(r542a <= r576 AND r543a <= r577 AND r544a <= r578 AND r550a > r578a, 1, 0)) AS Levering,
SUM(IF(r542a <= r576 AND r543a <= r577 AND r544a <= r578 AND r550a <= r578a, 1, 0)) AS Ingen

FROM ordre5
WHERE ordre5.r572a >= '$startdato' && ordre5.r572a < '$slutdato'
GROUP BY month(r572a)";

kjulius --> Smid et svar.
arne_v --> tak for hjælpen, du sendte mig et godt stykke af vejen.
Avatar billede kjulius Novice
21. september 2006 - 21:33 #14
Tak for frugtkurven!
Avatar billede lsskaarup Nybegynder
22. september 2006 - 13:03 #15
Selv tak ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester