IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

2 Requêtes assez corsées


Sujet :

Langage SQL

  1. #21
    Membre régulier Avatar de Frog74
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    Merci du conseil je vais aller voir sur le net ce qu'est un index , mais d'abord je creer tous les cas possibles en remplissant ma table.

  2. #22
    Membre régulier Avatar de Frog74
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    J'ai un problème , la requête marche que si les evenement se suivent :

    NEvenement NMachine Type Instant
    1 0 ManuelON 01/01/2001 08:00:00
    2 0 BrocheON 01/01/2001 08:01:00
    3 0 BrocheOFF 01/01/2001 08:20:00
    4 0 ManuelOFF 01/01/2001 08:21:00
    5 0 BrocheON 01/01/2001 08:21:00
    6 0 BrocheOFF 01/01/2001 09:00:00
    7 0 ManuelON 01/01/2001 09:00:00
    8 0 ManuelOFF 01/01/2001 09:01:00

    Voyez ma table , je lance ma requête et j'ai 58 minutes de production et seulement une minute de reglages (correspond au temps entre chaque ON/OFF manuel).Ce qui veut dire que l'evenement 1 et 4 ne sont pas pris en compte .

  3. #23
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Ma requête ne retournait que le temps d'activité de la broche par machine.

    Il faudrait montrer votre autre requête pour trouver des erreurs dans la prise en compte des pannes.

  4. #24
    Membre régulier Avatar de Frog74
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    SELECT EvenementOn.NMachine, SUM(Datediff("s",EvenementOn.Instant, EvenementOff.Instant)/60) AS [Temps total en Réglages(min)]
    FROM Evenement AS EvenementOn, Evenement AS EvenementOff
    WHERE EvenementOn.Type LIKE 'ManuelON'
    AND EvenementOff.Type LIKE 'ManuelOFF'
    AND EvenementOn.NMachine = EvenementOff.NMachine 
    AND EvenementOn.Instant < EvenementOff.Instant
    AND NOT EXISTS (	SELECT 1 
    			FROM Evenement 
    			WHERE Evenement.NMachine = EvenementOff.NMachine
    			AND Evenement.Instant < EvenementOff.Instant
    			AND Evenement.Instant > EvenementOn.Instant
    		)
    GROUP BY EvenementOn.NMachine;
    Voila , strictement la même seulement avec le type qui change.Seulement donc si jai :
    ManuelON,BrocheON,BrocheOFF,ManuelOFF dans l'ordre dans ma table la requête ne detecte pas les manuels

    J'ai pensé modifier comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    AND NOT EXISTS (	SELECT 1 
    			FROM Evenement 
    			WHERE Evenement.NMachine = EvenementOff.NMachine
    			AND EvenementOn.Type LIKE 'BrocheON'
    			AND EvenementOff.Type LIKE 'BrocheOFF'
    			AND Evenement.Instant < EvenementOff.Instant
    			AND Evenement.Instant > EvenementOn.Instant
    		)
    Mais maintenant j'ai 83 minutes de réglages :s lol.

    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    NEvenement	NMachine	Type	Instant
    1	0	ManuelON	01/01/2001 08:00:00
    2	0	BrocheON	01/01/2001 08:01:00
    3	0	BrocheOFF	01/01/2001 08:20:00
    4	0	ManuelOFF	01/01/2001 08:21:00
    5	0	BrocheON	01/01/2001 08:21:00
    6	0	BrocheOFF	01/01/2001 09:00:00
    7	0	ManuelON	01/01/2001 09:00:00
    8	0	ManuelOFF	01/01/2001 09:01:00

  5. #25
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Mea culpa, les tests utilisaient des jeux d'essai un peu trop réduits.

    Dans la sous requête corrélées j'ai oublié de ne tenir compte que des évènement de terminaison (OFF). J'ai donc ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND Evenement.Type LIKE EvenementOff.Type
    ce qui donne au final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT EvenementOn.NMachine, SUM(Datediff("s",EvenementOn.Instant, EvenementOff.Instant))
    FROM Evenement AS EvenementOn, Evenement AS EvenementOff
    WHERE EvenementOn.Type LIKE 'ManuelON'
    AND EvenementOff.Type LIKE 'ManuelOFF'
    AND EvenementOn.NMachine = EvenementOff.NMachine 
    AND EvenementOn.Instant < EvenementOff.Instant
    AND NOT EXISTS (	SELECT 1 
    			FROM Evenement 
    			WHERE Evenement.NMachine = EvenementOff.NMachine
    			AND Evenement.Instant < EvenementOff.Instant
    			AND Evenement.Instant > EvenementOn.Instant
    			AND Evenement.Type LIKE EvenementOff.Type
    		)
    GROUP BY EvenementOn.NMachine;
    Cette correction est bien entendue valable quelque soit le type d'événement qu'on veut comptabiliser.

  6. #26
    Membre régulier Avatar de Frog74
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    Merci bien , si vous savez comment savoir que a chaque BrocheON je n'ai aucun ManuelON d'enclenché ou PanneON je suis preneur

  7. #27
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    J'ai dépensé mon quota pour vous aujourd'hui.

    Mais de la même manière que j'ai cherché l'évènement BrocheOFF directement consécutif à un évènement BrocheON, vous pouvez essayer de cogiter pour trouver la période Manuel au sein d'une période de BrocheON.

  8. #28
    Membre régulier Avatar de Frog74
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    Voila j'ai eu pas mal d'idée et la dernière fue la moins bonne je crois : )
    Je comptais dire que je ne pouvais pas trouvé de brocheOFF tel qu'il soit encadré par un ManuelOFF et un ManuelON.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    SELECT SUM(Datediff("s",EvenementOn.Instant, EvenementOff.Instant)/60) AS [Temps total en Production(min)]
    FROM Evenement AS EvenementOn, Evenement AS EvenementOff,Evenement AS EvenementManuelOn,Evenement AS EvenementManuelOff
     
    WHERE EvenementOn.Type LIKE 'BrocheON'
    AND EvenementOff.Type LIKE 'BrocheOFF'
    AND EvenementManuelOff.Type LIKE 'ManuelOFF'
    AND EvenementManuelOn.Type LIKE 'ManuelON'
     
    AND EvenementOff.NMachine = [Entrez le numéro de la Machine]
    AND EvenementManuelOn.NMachine = EvenementOff.NMachine
    AND EvenementManuelOn.NMachine = EvenementManuelOFf.NMachine
    AND EvenementOn.NMachine = EvenementOff.NMachine 
     
    AND EvenementOn.Instant < EvenementOff.Instant
    AND EvenementManuelOn.Instant < EvenementManuelOff.Instant
     
    AND NOT EXISTS (	SELECT 1 
    			FROM Evenement 
    			WHERE Evenement.NMachine = EvenementOff.NMachine
    			AND Evenement.Instant < EvenementOff.Instant
    			AND Evenement.Instant > EvenementOn.Instant
    			AND Evenement.Type LIKE EvenementOff.Type
    			AND Evenement.Instant < EvenementManuelOff.Instant
    			AND Evenement.Instant > EvenementManuelOn.Instant
    		)
    GROUP BY EvenementOn.NMachine;
    Seulement , j'ai quand même choisit un brocheON et donc il me met un 28000 à peu pret en temps avec la soustraction.

    Il faut donc que je choisisse un BrocheON tel qu'aucun ManuelON n'existse tel que les deux soient consécutif et de même pour le brocheOFF.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    SELECT SUM(Datediff("s",EvenementOn.Instant, EvenementOff.Instant)/60) AS [Temps total en Production(min)]
    FROM Evenement AS EvenementOn, Evenement AS EvenementOff,Evenement AS EvenementManuelOn,Evenement AS EvenementManuelOff
     
    WHERE EvenementOn.Type LIKE 'BrocheON'
    AND EvenementOff.Type LIKE 'BrocheOFF'
    AND EvenementManuelOff.Type LIKE 'ManuelOFF'
    AND EvenementManuelOn.Type LIKE 'ManuelON'
     
    AND EvenementOff.NMachine = [Entrez le numéro de la Machine]
    AND EvenementManuelOn.NMachine = EvenementOff.NMachine
    AND EvenementManuelOn.NMachine = EvenementManuelOFf.NMachine
    AND EvenementOn.NMachine = EvenementOff.NMachine 
     
    AND EvenementOn.Instant < EvenementOff.Instant
    AND EvenementManuelOn.Instant < EvenementManuelOff.Instant
     
    AND NOT EXISTS (	SELECT 1 
    			FROM Evenement 
    			WHERE Evenement.NMachine = EvenementOff.NMachine
    			AND Evenement.Instant < EvenementOff.Instant
    			AND Evenement.Instant > EvenementOn.Instant
    			AND Evenement.Type LIKE EvenementOff.Type
    			AND Evenement.Instant < EvenementManuelOff.Instant
    			AND Evenement.Instant > EvenementManuelOn.Instant
    		)
    AND NOT EXISTS (
    			SELECT 1 
    			FROM Evenement 
    			WHERE Evenement.NMachine = EvenementOn.NMachine
    			AND Evenement.Instant > EvenementOn.Instant
    			AND Evenement.Instant < EvenementOff.Instant
    			AND Evenement.Type LIKE EvenementOn.Type
    			AND Evenement.Instant > EvenementManuelOff.Instant
    			AND Evenement.Instant < EvenementManuelOn.Instant
    		)
    GROUP BY EvenementOn.NMachine;
    J'ai pensé à ça mais le résultat est le même je ne comprend toujours pas pourquoi .
    Voila la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    NEvenement	NMachine	Type	Instant
    1	0	ManuelON	01/01/2001 08:00:00
    2	0	BrocheON	01/01/2001 08:01:00
    3	0	BrocheOFF	01/01/2001 08:20:00
    4	0	ManuelOFF	01/01/2001 08:21:00
    5	0	BrocheON	01/01/2001 08:21:00
    6	0	BrocheOFF	01/01/2001 09:00:00
    7	0	ManuelON	01/01/2001 09:00:00
    8	0	ManuelOFF	01/01/2001 09:01:00
    9	0	PanneON	01/01/2001 09:01:00
    10	0	PanneOFF	01/01/2001 12:00:00
    11	1	ManuelON	01/01/2001 08:00:00
    12	1	BrocheON	01/01/2001 08:01:00
    13	1	BrocheOFF	01/01/2001 08:20:00
    14	1	ManuelOFF	01/01/2001 08:21:00
    15	1	BrocheON	01/01/2001 08:21:00
    16	1	BrocheOFF	01/01/2001 09:00:00
    17	1	ManuelON	01/01/2001 09:00:00
    18	1	ManuelOFF	01/01/2001 09:01:00
    19	1	PanneON	01/01/2001 09:01:00
    20	1	PanneOFF	01/01/2001 12:00:00
    21	0	ManuelON	02/01/2001 08:00:00
    22	0	BrocheON	02/01/2001 08:01:00
    23	0	BrocheOFF	02/01/2001 08:20:00
    24	0	ManuelOFF	02/01/2001 08:21:00
    25	0	BrocheON	02/01/2001 08:21:00
    26	0	BrocheOFF	02/01/2001 09:00:00
    27	0	ManuelON	02/01/2001 09:00:00
    28	0	ManuelOFF	02/01/2001 09:01:00
    29	0	PanneON	02/01/2001 09:01:00
    30	0	PanneOFF	02/01/2001 12:00:00
    Et après réflexion mon encadrement esttrop vaste !!
    Il y aura forcément un ManuelOFF plus grand que l'evenementOFF un un ManuelON plus petit que l'evenementON donc mon problème est de bien ciblé un evenementmanuelON et OFF en particulier :s

  9. #29
    Membre régulier Avatar de Frog74
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    J'ai pensé à trouver un manuel on et manuel Off consécutyif et de regarder si mon broche off si bien choisi lui aussi n'était pas entre les deux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    SELECT SUM(Datediff("s",EvenementOn.Instant, EvenementOff.Instant)/60) AS [Temps total en Production(min)]
    FROM Evenement AS EvenementOn, Evenement AS EvenementOff,Evenement AS EvenementManuelOff, Evenement AS EvenementManuelON
     
    WHERE EvenementOn.Type LIKE 'BrocheON'
    AND EvenementOff.Type LIKE 'BrocheOFF'
    AND EvenementManuelOn.Type LIKE 'ManuelON'
    AND EvenementManuelOff.Type LIKE 'ManuelOFF'
     
    AND EvenementOff.NMachine = [Entrez le numéro de la Machine]
    AND EvenementOn.NMachine = EvenementOff.NMachine
    AND EvenementManuelOn.NMachine = EvenementManuelOff.NMachine
    AND EvenementManuelOn.NMachine = EvenementOn.NMachine
     
    AND EvenementOn.Instant < EvenementOff.Instant
    AND EvenementManuelOn.Instant < EvenementManuelOff.Instant
     
    AND NOT EXISTS (	SELECT 1 
    			FROM Evenement 
    			WHERE Evenement.NMachine = EvenementOff.NMachine
    			AND Evenement.Instant < EvenementOff.Instant
    			AND Evenement.Instant > EvenementOn.Instant
    			AND Evenement.Type LIKE EvenementOff.Type
    		)
    AND NOT EXISTS (
    			SELECT 1 
    			FROM Evenement 
    			WHERE Evenement.NMachine = EvenementManuelOff.NMachine
    			AND Evenement.Instant < EvenementManuelOff.Instant
    			AND Evenement.Instant > EvenementManuelOn.Instant
    			AND Evenement.Type LIKE EvenementManuelOff.Type
    		)
    AND NOT Exists (
    			SELECT 1 
    			FROM Evenement 
    			WHERE Evenement.NMachine = EvenementManuelOff.NMachine
    			AND Evenement.Instant < EvenementManuelOff.Instant
    			AND Evenement.Instant > EvenementManuelOn.Instant
    			AND Evenement.Type LIKE EvenementOff.Type
    		)
    GROUP BY EvenementOn.NMachine;
    Seulement , je trouve encore des résultat en multiple de 58 qui est le temps total en production sans prendre en compte le fait que je suis en mode manuel aussi ... ce qui est en fait le but de ma requête !!!

Discussions similaires

  1. [AC-2003] Requête assez complexe
    Par Apopis01 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 30/12/2009, 11h11
  2. Requête assez complexe
    Par Naruto_kun dans le forum Développement
    Réponses: 1
    Dernier message: 12/02/2009, 17h50
  3. [SQL] Requête assez particulière
    Par rems033 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 14/06/2008, 15h37
  4. [Débutant] Requête assez compliquée
    Par pc.bertineau dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/06/2007, 11h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo