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

InterBase Discussion :

Requete sql avec les CASE


Sujet :

InterBase

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Points : 111
    Points
    111
    Par défaut Requete sql avec les CASE
    Salut,

    Soit le code suivant:
    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
      P.DATE_P,
      P.GROUPE_P,
      (SELECT P1.INDEX_JOUR FROM PRODUCTION P1 WHERE P1.SOCIETE = :SOCIETE AND P1.DATE_P =  (SELECT MAX(P2.DATE_P) FROM PRODUCTION P2 WHERE P2.SOCIETE = :SOCIETE AND P2.DATE_P < P.DATE_P )) AS INDEX_DEBUT,
      P.INDEX_JOUR AS INDEX_FIN,
     
      (SELECT CASE WHEN P.GROUPE_P = H.GROUPE1 THEN H.GROUPE2
                   WHEN P.GROUPE_P = H.GROUPE2 THEN H.GROUPE1
                   END
      FROM HEURE_FONCTIONNEMENT H
      WHERE H.SOCIETE = :SOCIETE AND
            H.DATE_R = P.DATE_P) AS GROUPE_SECONDAIRE,
     
    (SELECT CASE WHEN P.GROUPE_P = H.GROUPE1 THEN H.NOMBRE_HEURE_GROUPE1
                   WHEN P.GROUPE_P = H.GROUPE2 THEN H.NOMBRE_HEURE_GROUPE2
                   END
      FROM HEURE_FONCTIONNEMENT H
      WHERE H.SOCIETE = :SOCIETE AND
            H.DATE_R = P.DATE_P) AS NOMBRE_HEURE_GROUPE_PRINCIPAL,
     
    (SELECT CASE WHEN P.GROUPE_P = H.GROUPE1 THEN H.NOMBRE_HEURE_GROUPE2
                   WHEN P.GROUPE_P = H.GROUPE2 THEN H.NOMBRE_HEURE_GROUPE1
                   END
      FROM HEURE_FONCTIONNEMENT H
      WHERE H.SOCIETE = :SOCIETE AND
            H.DATE_R = P.DATE_P) AS NOMBRE_HEURE_GROUPE_SECONDAIRE,
     
    (SELECT CASE WHEN P.GROUPE_P = C.GROUPE1 THEN AVG(C.I_MAX_G2)
                   WHEN P.GROUPE_P = C.GROUPE2 THEN AVG(C.I_MAX_G1)
                   END
      FROM CHARGE C
      WHERE C.SOCIETE = :SOCIETE AND
            C.DATE_R = P.DATE_P) AS INTENSITE
    FROM
      PRODUCTION P
    WHERE P.SOCIETE = :SOCIETE AND
          P.DATE_P BETWEEN :DEBUT AND :FIN
    ORDER BY
          P.DATE_P
    J'essaye d'exécuter cette requête SQL avec delphi 7 avec TIBQuery mais je reçois à ma grande supprise cette erreur que je comprend pas vu que je dsipose meme pas de donnée dans mes tables et que je peux activer la propriété active du TIBQuery:

    J'utilise Interbase 7.5 sous delphi 7
    ---------------------------
    Notification d'une exception du débogueur
    ---------------------------
    Le projet CENTRALE.exe a provoqué une classe d'exception EIBInterBaseError avec le message 'Dynamic SQL Error
    SQL error code = -303
    arithmetic exception, numeric overflow, or string truncation'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
    ---------------------------
    OK Aide
    ---------------------------
    Quelqu'un pourrai interpréter cette erreur pour moi?


    Voici la structure de mes 3 tables:
    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
    41
    42
    43
    44
     
    CREATE TABLE "PRODUCTION" 
    (
      "CODE"	VARCHAR(6) NOT NULL,
      "SOCIETE"	VARCHAR(3) NOT NULL,
      "DATE_P"	DATE NOT NULL,
      "INDEX_JOUR"	NUMERIC(9, 2) NOT NULL,
      "GROUPE_P"	INTEGER NOT NULL,
     PRIMARY KEY ("CODE"),
     UNIQUE ("SOCIETE", "DATE_P")
    );
     
    CREATE TABLE "HEURE_FONCTIONNEMENT" 
    (
      "CODE"	VARCHAR(6) NOT NULL,
      "SOCIETE"	VARCHAR(3) NOT NULL,
      "DATE_R"	DATE NOT NULL,
      "CODE_JOUR"	INTEGER NOT NULL,
      "NOMBRE_HEURE_CENTRALE"	INTEGER NOT NULL,
      "DETAILS_HEURES"	VARCHAR(75),
      "RALLONGE"	INTEGER DEFAULT 0,
      "DEMANDEUR_RALLONGE"	VARCHAR(35),
      "GROUPE1"	INTEGER NOT NULL,
      "NOMBRE_HEURE_GROUPE1"	INTEGER DEFAULT 0,
      "GROUPE2"	INTEGER DEFAULT 0,
      "NOMBRE_HEURE_GROUPE2"	INTEGER DEFAULT 0,
      "OBSERVATIONS"	VARCHAR(60),
     UNIQUE ("DATE_R", "SOCIETE"),
     PRIMARY KEY ("CODE")
    );
     
    CREATE TABLE "CHARGE" 
    (
      "CODE"	VARCHAR(8) NOT NULL,
      "SOCIETE"	VARCHAR(3) NOT NULL,
      "DATE_R"	DATE NOT NULL,
      "HEURE_R"	TIME NOT NULL,
      "GROUPE1"	INTEGER NOT NULL,
      "I_MAX_G1"	NUMERIC(5, 2) NOT NULL,
      "GROUPE2"	INTEGER,
      "I_MAX_G2"	NUMERIC(5, 2),
     PRIMARY KEY ("CODE"),
     UNIQUE ("SOCIETE", "DATE_R", "HEURE_R")
    );

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 227
    Points : 28 228
    Points
    28 228
    Par défaut
    A de nombreux endroits il traine des = :SOCIETE. Les : ne sont pas reconnus comme étant valides.

    Lorsque tu met un alias sur le résultat d'un requete ou sur une table, il ne faut pas mettre le mot clé AS

    La sous requete renommée INTENSITE pose problème au niveau de l'agrégation et de l'utilisation de AVG

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Points : 111
    Points
    111
    Par défaut
    Salut,
    Pour ta première remarque
    "A de nombreux endroits il traine des = :SOCIETE. Les : ne sont pas reconnus comme étant valides."
    , j'ai pas bien pigé puisque le
    :SOCIETE
    par exemple signifie que SOCIETE est un paramètre qui sera fourni donc je vois pas ou est le problème la bas.
    Pour la 3ème remarque,
    La sous requete renommée INTENSITE pose problème au niveau de l'agrégation et de l'utilisation de AVG
    , que me propose tu exactement car je sais pas comment faire autrement vu que je veux la moyenne des relévés de charge du jour( A une date donnée, il y'a au moins une relevé de d'intensité)

    Et pour ta deuxième remarque, si j'enlève le mot clé AS, je l'ai pas éssayé ce que je ferai juste après ca, j'aurai un message d'erreur.

    Donc si possible, essayes de transformer la requête suivant tes remarques et postes les au forum. Ce qui est sur, je prends en compte tes remarques pour essayer de mon coté.

    Cordialement.

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 227
    Points : 28 228
    Points
    28 228
    Par défaut
    Ok pour SOCIETE, perso je ne connais pas cette syntaxe pour les paramètres, c'est peut-être propre à Interbase ?

    Pour ta sous-requete INTENSITE normalement il faudrait l'écrire de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (SELECT CASE WHEN P.GROUPE_P = C.GROUPE1 THEN AVG(C.I_MAX_G2)
                 WHEN P.GROUPE_P = C.GROUPE2 THEN AVG(C.I_MAX_G1)
            END
     FROM CHARGE C
     WHERE C.SOCIETE = @SOCIETE AND
           C.DATE_R = P.DATE_P
     GROUP BY C.GROUPE1,C.GROUPE2) AS INTENSITE
    Mais même comme ça, je ne suis pas certain que ça marche. Si jamais elle peut renvoyer plusieurs ligne (du fait du group by) tu auras certainement une erreur.
    Il est possible qu'il faille penser le calcul autrement, mais je ne vois pas trop comment, je ne maitrise pas ton dossier.

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Points : 111
    Points
    111
    Par défaut
    Après 2 jours de tractation, voici le code fonctionnel
    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
      P.DATE_P,
      P.GROUPE_P,
    (SELECT P1.INDEX_JOUR FROM PRODUCTION P1 WHERE P1.SOCIETE = P.SOCIETE AND P1.DATE_P =  (SELECT MAX(P2.DATE_P) FROM PRODUCTION P2 WHERE P2.SOCIETE = P.SOCIETE AND P2.DATE_P < P.DATE_P )) AS INDEX_DEBUT,
      P.INDEX_JOUR AS INDEX_FIN,
     
      (SELECT CASE WHEN P.GROUPE_P = H.GROUPE1 THEN H.GROUPE2
                   WHEN P.GROUPE_P = H.GROUPE2 THEN H.GROUPE1
                   END
      FROM HEURE_FONCTIONNEMENT H
      WHERE H.SOCIETE = P.SOCIETE AND
            H.DATE_R = P.DATE_P) AS GROUPE_SECONDAIRE,
     
    (SELECT CASE WHEN P.GROUPE_P = H.GROUPE1 THEN H.NOMBRE_HEURE_GROUPE1
                   WHEN P.GROUPE_P = H.GROUPE2 THEN H.NOMBRE_HEURE_GROUPE2
                   END
      FROM HEURE_FONCTIONNEMENT H
      WHERE H.SOCIETE = P.SOCIETE AND
            H.DATE_R = P.DATE_P) AS NOMBRE_HEURE_GROUPE_PRINCIPAL,
     
    (SELECT CASE WHEN P.GROUPE_P = H.GROUPE1 THEN H.NOMBRE_HEURE_GROUPE2
                   WHEN P.GROUPE_P = H.GROUPE2 THEN H.NOMBRE_HEURE_GROUPE1
                   END
      FROM HEURE_FONCTIONNEMENT H
      WHERE H.SOCIETE = P.SOCIETE AND
                     H.DATE_R = P.DATE_P) AS NOMBRE_HEURE_GROUPE_SECONDAIRE,
     
    (SELECT AVG(CASE WHEN P.GROUPE_P = C.GROUPE1 THEN  C.I_MAX_G2
                 WHEN P.GROUPE_P = C.GROUPE2 THEN  C.I_MAX_G1
                    END)
      FROM CHARGE C
      WHERE C.SOCIETE = P.SOCIETE AND
            C.DATE_R = P.DATE_P ) AS INTENSITE
    FROM
      PRODUCTION P
    WHERE P.SOCIETE = :SOCIETE AND
          P.DATE_P BETWEEN :DEBUT AND :FIN
    ORDER BY
          P.DATE_P

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requete SQL avec filtrage sur les derniers enregistrements
    Par yaumme dans le forum Langage SQL
    Réponses: 14
    Dernier message: 25/03/2009, 01h11
  2. Requete sql avec les dates
    Par Slashs dans le forum Requêtes
    Réponses: 6
    Dernier message: 02/12/2008, 13h29
  3. [SQL] requete sql avec les dates
    Par berti dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/03/2008, 13h32
  4. [JDBC] retour de requete sql avec valeur NULL
    Par maxxou dans le forum JDBC
    Réponses: 3
    Dernier message: 13/09/2004, 15h40
  5. Génération de script SQL avec les données
    Par borgfabr dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/03/2004, 14h57

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