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

Requêtes MySQL Discussion :

REQUETE à double conditions


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier Avatar de tidou95220
    Homme Profil pro
    BI junior
    Inscrit en
    Novembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BI junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2008
    Messages : 263
    Points : 90
    Points
    90
    Par défaut REQUETE à double conditions
    Bonjour,

    J'ai un petit soucis à propos de ma requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT date_format( MAX( dates ) , '%d/%m/%Y' ) AS max, TRUNCATE( donnee, 3 ) AS 'trunk' , ADDTIME( date_creation, '0 02:00:00' ) AS date_creation
    FROM donnees, source, periodicite, description1, description2
    WHERE periodicite.ID_periodicite = donnees.ID_periodicite
    AND source.ID_source = donnees.ID_source
    AND description1.ID_description1 = donnees.ID_description1
    AND description2.ID_description2 = donnees.ID_description2
    AND donnees.ID_indicateur = '14'
    AND donnees.ID_description5 = '12'
    AND donnees.ID_pays = '119'
    GROUP BY description2.description2, periodicite.periodicite, source.source, description1
    HAVING trunk >0
    J'aimerai afficher ma date la plus recente mais dont le trunk est différent de 0 la dans mon cas il va meme pas afficher l'enregistrement.

    un exemple : j'ai plusieurs données, pour l'année 2007 pour un nombre de 28 voitures et j'ai 0 voiture pour l'année 2008, j'aimerai afficher 28 mais la dans mon cas il affichera 0 parce que avant j'ai utiliser MAX

    Merci comment faire :s

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bjr,

    Un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT
    CASE TRUNCATE( donnee, 3 )
    WHEN 0
    // = Qd le truncate = 0
    ELSE
    // = Qd le truncate <> 0
    END;
    Fonctionnerait-il ?

    Cdlt,

  3. #3
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    les jointures s'écrivent avec l'opérateur JOIN et ses différentes variante depuis 20 ans...


    et on évite d'utiliser des mots clés comme descripteur ou nom de colonne sans proprement les quoter... un peu de surnommage...

    quand tu veux que quelque chose affecte le groupage, tu mets la condition dans le having...

    ça donne:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT date_format( dates, '%d/%m/%Y' ) AS 'max', TRUNCATE( donnee, 3 ) AS 'trunk' , ADDTIME( date_creation, '0 02:00:00' ) AS date_creation
    FROM donnees d
    left join periodicite p on p.ID_periodicite = d.ID_periodicite
    left join source s on s.ID_source = d.ID_source
    left join description1 d1 on d1.ID_description1 = d.ID_description1
    left join description2 d2 on d2.ID_description2 = d.ID_description2
    where d.ID_indicateur = '14'
      AND d.ID_description5 = '12'
      AND d.ID_pays = '119'
    GROUP BY d2.description2, p.periodicite, s.source, d1,description1
    HAVING trunk >0 and date=max(date)
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Encore faudrait-il être sûr de la dépendance fonctionnelle des colonnes du SELECT (dates, donnee, date_creation) avec celles du regroupement (d2.description2, p.periodicite, s.source, d1,description1).
    Ce qui me semble loin d'être établi.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    certes kris...

    mais bon on fait avec ce qu'il nous donne

    après sans structure de tables...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  6. #6
    Membre régulier Avatar de tidou95220
    Homme Profil pro
    BI junior
    Inscrit en
    Novembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BI junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2008
    Messages : 263
    Points : 90
    Points
    90
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT date_format( dates, '%d/%m/%Y' ) AS 'max', TRUNCATE( donnee, 3 ) AS 'trunk' , ADDTIME( date_creation, '0 02:00:00' ) AS date_creation
    FROM donnees d
    LEFT JOIN periodicite p ON p.ID_periodicite = d.ID_periodicite
    LEFT JOIN source s ON s.ID_source = d.ID_source
    LEFT JOIN description1 d1 ON d1.ID_description1 = d.ID_description1
    LEFT JOIN description2 d2 ON d2.ID_description2 = d.ID_description2
    WHERE d.ID_indicateur = '14'
      AND d.ID_description5 = '12'
      AND d.ID_pays = '119'
    GROUP BY d2.description2, p.periodicite, s.source, d1.description1
    HAVING trunk >0 AND date=max(date)
    Il me dit : #1054 - Unknown column 'date' in 'having clause'

    j'ai mi dates qui etait l'erreur et il me dit toujours : #1054 - Unknown column 'dates' in 'having clause'

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Bien sûr ! Tu n'as ni colonne "date", ni "dates" dans ton SELECT donc HAVING ne peut pas la trouver.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    et avec:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING trunk >0 AND dates=max(dates)

    si tu as plusieurs dates dans plusieurs tables genre "donnees" et une ou plusieurs autres tu dois choisir celui qui est pertinent...

    si c'est "donnees" alors:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING trunk >0 AND d.dates=max(d.dates)

    comme je le redis tu nous donne une requête sans les tables donc à moins d'être devin je sais pas dans quelle table sont telles ou telles colonnes sauf celles dont la dépendance était explicite dans ta requête...

    à toi de voir avec ton modèle de données
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  9. #9
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Bien sûr ! Tu n'as ni colonne "date", ni "dates" dans ton SELECT donc HAVING ne peut pas la trouver.
    regarde bien dans le date_format au début du select...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    regarde bien dans le date_format au début du select...
    Oui mais le HAVING cherche plutôt dans les alias "max", "trunk" et "date_creation" non ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    mea culpa... car si tu utilise une fonction sur la colonne il semble qu'il ne voit pas la colonne

    donc soit:
    • on rajoute la colonne dates dans le select...
    • on utilise la colonne 'max' comme référence à la place de dates dans le having...
    et là plus de soucis enfin normalement...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  12. #12
    Membre régulier Avatar de tidou95220
    Homme Profil pro
    BI junior
    Inscrit en
    Novembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BI junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2008
    Messages : 263
    Points : 90
    Points
    90
    Par défaut
    Donc si j'ai bien compris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT date_format( dates, '%d/%m/%Y' ) AS 'max', TRUNCATE( donnee, 3 ) AS 'trunk' , ADDTIME( date_creation, '0 02:00:00' ) AS date_creation
    FROM donnees d
    LEFT JOIN periodicite p ON p.ID_periodicite = d.ID_periodicite
    LEFT JOIN source s ON s.ID_source = d.ID_source
    LEFT JOIN description1 d1 ON d1.ID_description1 = d.ID_description1
    LEFT JOIN description2 d2 ON d2.ID_description2 = d.ID_description2
    WHERE d.ID_indicateur = '14'
      AND d.ID_description5 = '12'
      AND d.ID_pays = '119'
    GROUP BY d2.description2, p.periodicite, s.source, d1.description1
    HAVING trunk >0 AND max=max(max)

  13. #13
    Membre régulier Avatar de tidou95220
    Homme Profil pro
    BI junior
    Inscrit en
    Novembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BI junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2008
    Messages : 263
    Points : 90
    Points
    90
    Par défaut
    cela reviens au même au final ça répond pas à ma demande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT date_format( dates, '%d/%m/%Y' ) AS 'max', TRUNCATE( donnee, 3 ) AS 'trunk', ADDTIME( date_creation, '0 02:00:00' ) AS date_creation
    FROM donnees d LEFT JOIN periodicite p ON p.ID_periodicite = d.ID_periodicite 
    LEFT JOIN source s ON s.ID_source = d.ID_source 
    LEFT JOIN description1 d1 ON d1.ID_description1 = d.ID_description1 
    LEFT JOIN description2 d2 ON d2.ID_description2 = d.ID_description2 
    WHERE d.ID_indicateur = '4' 
    AND d.ID_description5 = '4' 
    AND d.ID_pays = '116' 
    GROUP BY d2.description2, p.periodicite, s.source, d1.description1 ;
    J'ai ce resultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    01/03/2012 	11.200 	2012-05-02 12:14:04
    01/04/2012 	0.000 	2012-05-11 11:40:29
    01/01/2013 	9.600 	2012-05-11 14:51:23
    01/01/2013 	11.800 	2012-03-09 19:06:52
    si je met à la fin HAVING trunk > 0 AND max=max(max); cela va me supprimer ma ligne du 01/04/2012 alors qu'il existe un nombre > 0 en 01/03/2012 dans ma base...

  14. #14
    Membre régulier Avatar de tidou95220
    Homme Profil pro
    BI junior
    Inscrit en
    Novembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BI junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2008
    Messages : 263
    Points : 90
    Points
    90
    Par défaut
    moi je voudrai ça comme resultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    01/03/2012 	11.200 	2012-05-02 12:14:04
    01/03/2012 	2.000 	2012-05-11 11:40:29
    01/01/2013 	9.600 	2012-05-11 14:51:23
    01/01/2013 	11.800 	2012-03-09 19:06:52
    je veux la date inférieur car le resultat est = 0 donc je passe à 01/03/2012 qui à pour valeur 2.000

  15. #15
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    un petit rappel, c'est de bien quoter les nom de colonne... surtout quand il correspondent à un mot clé...

    tu parles du having mais tu l'as enlevé de la requête???

    je te rappelle que c'est toi qui propose le trunk>0 dés ta première requête...

    j'avoue que je vois pas trop pourquoi ça marche pour les 2 dates de 2013 et pas celles de 2012 si elles sont construites de la même manière...

    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  16. #16
    Membre régulier Avatar de tidou95220
    Homme Profil pro
    BI junior
    Inscrit en
    Novembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BI junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2008
    Messages : 263
    Points : 90
    Points
    90
    Par défaut
    Je suis bloqué...

  17. #17
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    bon, autre approche...

    si je comprends bien ton problème:

    si trunk est 0, tu veux la valeur précédente... est ce que c'est bien ça?

    car si c'est ça... tu ne peux pas le faire en une seule requête...
    par contre, en 2 oui et une procédure stockée pour encapsuler tout ça et n'avoir qu'à faire un seul appel:
    • une table temporaire (id,dates,trunk,date_creation) dans laquelle tu stockes le résultat de ta requête (sans having)
    • une requête qui va lire chaque entrée et renvoyer soit la valeur en cours, soit celle qu'une sous-requête renvoie (la dernière valeur de trunk>0 précédente) en utilisant un if(condition,vrai,faux) dans le select... ne pas oublier de mettre la sous-requête entre parenthèses...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  18. #18
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    bon, autre approche...

    si je comprends bien ton problème:

    si trunk est 0, tu veux la valeur précédente... est ce que c'est bien ça?

    car si c'est ça... tu ne peux pas le faire en une seule requête...
    par contre, en 2 oui et une procédure stockée pour encapsuler tout ça et n'avoir qu'à faire un seul appel:
    • une table temporaire (id,dates,trunk,date_creation) dans laquelle tu stockes le résultat de ta requête (sans having)
    • une requête qui va lire chaque entrée et renvoyer soit la valeur en cours, soit celle qu'une sous-requête renvoie (la dernière valeur de trunk>0 précédente) en utilisant un if(condition,vrai,faux) dans le select... ne pas oublier de mettre la sous-requête entre parenthèses...
    Je n'ai pas relu toute la discussion et je sais que tu aimes les procédures stockées mais vite fait j'ai l'impression que si on est capable sur ce problème de faire une table temporaire, ça veut dire qu'on est capable de faire une sous-requête et une jointure dessus non ? Ou alors une table temporaire et une jointure.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  19. #19
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    si j'ai bien compris ce qu'il veut c'est que si une valeur "trunk" de sa requête est nulle (à 0 pas vide on s'entend bien) il veut repiquer celle de la ligne d'avant dans ce que génère sa requête

    sans faire un truc super lourd et peu optimisé en une grosse requête c'est un peu compliqué?

    on connait pas la taille de la table

    avec pour requête de base pour le traitement que je rappelle ici pour pas relire du début:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT date_format( MAX( dates ) , '%d/%m/%Y' ) AS max, TRUNCATE( donnee, 3 ) AS 'trunk' , ADDTIME( date_creation, '0 02:00:00' ) AS date_creation
    FROM donnees, source, periodicite, description1, description2
    WHERE periodicite.ID_periodicite = donnees.ID_periodicite
    AND source.ID_source = donnees.ID_source
    AND description1.ID_description1 = donnees.ID_description1
    AND description2.ID_description2 = donnees.ID_description2
    AND donnees.ID_indicateur = '14'
    AND donnees.ID_description5 = '12'
    AND donnees.ID_pays = '119'
    GROUP BY description2.description2, periodicite.periodicite, source.source, description1

    ou ma version moderne
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT date_format( dates, '%d/%m/%Y' ) AS 'max', TRUNCATE( donnee, 3 ) AS 'trunk' , ADDTIME( date_creation, '0 02:00:00' ) AS date_creation
    FROM donnees d
    LEFT JOIN periodicite p ON p.ID_periodicite = d.ID_periodicite
    LEFT JOIN source s ON s.ID_source = d.ID_source
    LEFT JOIN description1 d1 ON d1.ID_description1 = d.ID_description1
    LEFT JOIN description2 d2 ON d2.ID_description2 = d.ID_description2
    WHERE d.ID_indicateur = '14'
      AND d.ID_description5 = '12'
      AND d.ID_pays = '119'
    GROUP BY d2.description2, p.periodicite, s.source, d1.description1

    c'est possible... c'est sur... mais est ce que ça va être facile, maintenable et efficace?
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  20. #20
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    J'ai relu la discussion et notamment les messages #13 et #14 et j'ai l'impression que tidou95220 cherche tout simplement la dernière donnée positive avec sa date.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT d2.description2, p.periodicite, s.source, d1.description1
    	MAX(dates) AS date_max
    FROM donnees d
    LEFT JOIN periodicite p ON p.ID_periodicite = d.ID_periodicite
    LEFT JOIN source s ON s.ID_source = d.ID_source
    LEFT JOIN description1 d1 ON d1.ID_description1 = d.ID_description1
    LEFT JOIN description2 d2 ON d2.ID_description2 = d.ID_description2
    WHERE d.ID_indicateur = '14'
      AND d.ID_description5 = '12'
      AND d.ID_pays = '119'
      AND donnee <> 0
    GROUP BY d2.description2, p.periodicite, s.source, d1.description1
    Puis je ferais une jointure de cette requête avec la table donnees pour récupérer la donnée tronquée et son calcul sur la date création correspondant à cette date, en supposant que ces informations sont bien dans la table donnes, ce qui n'est pas précisé dans le SELECT.

    Mais il faudrait en savoir plus sur la structure des tables parce que j'ai du mal à comprendre le schéma de données à partir de la requête.

    Pour le moment, j'en serais là :
    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
    SELECT date_format( dates, '%d/%m/%Y' ) AS 'max', 
    	TRUNCATE( donnee, 3 ) AS 'trunk', 
    	ADDTIME( date_creation, '0 02:00:00' ) AS date_creation
    FROM donnees
    INNER JOIN
    (
    	SELECT d2.description2, p.periodicite, s.source, d1.description1
    		MAX(dates) AS date_max
    	FROM donnees d
    	LEFT JOIN periodicite p ON p.ID_periodicite = d.ID_periodicite
    	LEFT JOIN source s ON s.ID_source = d.ID_source
    	LEFT JOIN description1 d1 ON d1.ID_description1 = d.ID_description1
    	LEFT JOIN description2 d2 ON d2.ID_description2 = d.ID_description2
    	WHERE d.ID_indicateur = '14'
    	AND d.ID_description5 = '12'
    	AND d.ID_pays = '119'
    	AND donnee <> 0
    	GROUP BY d2.description2, p.periodicite, s.source, d1.description1
    ) tmp
    	ON tmp.date_max = d.dates
    	AND -- maque des conditions de jointure
    Peut-être que les conditions de jointure manquantes peuvent se faire avec le d.ID_x utilisés dans les conditions de jointure de sa requête, auquel cas la sous-requête est probablement simplifiable en groupant sur ces ID_x et en ne joingnant les autres tables que dans la requête principale.

    D'ailleurs, je trouve toujours bizarre de faire un GROUP BY et de ne pas trouver les colonnes du GROUP BY dans le SELECT.
    quel est l'intérêt de récupérer une série de données sans les rattacher aux colonnes de groupage ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. requete avec une double condition
    Par k_boy dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/12/2007, 12h04
  2. Double condition dans une requete SQL
    Par quatar dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 29/05/2007, 16h22
  3. Réponses: 8
    Dernier message: 02/05/2006, 16h07
  4. Calculs dans une requete avec conditions multiples
    Par Sha1966 dans le forum Access
    Réponses: 3
    Dernier message: 13/01/2006, 15h18
  5. Requete avec condition
    Par Tchinkatchuk dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/06/2005, 09h37

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