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 et SQL. Discussion :

[2003] requete complexe : discretisation


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut [2003] requete complexe : discretisation
    Bonjour,

    J'ai une table dans laquelle sont reportés des résultats d'analyse de qualité de l'eau.

    Je cherche à discretiser les données numériques d'une colonne en 3 classes :
    <=25 ; >25 AND <=50 ; >50 , en vue de pouvoir ensuite compter le nombre d'enregistrement dans chaque classe, et de calculer la population correspondante (en %, et qui serait en fait la somme des pourcentages des enregistrements regroupés...)


    Access n'est pas vraiment fait pour ça, mais je suis sur qu'il doit y'avoir une possibilité, quitte à passer par plusieurs requetes intermédiaires... Ou peut être avec Iif (que je n'ai jamais utilisé jusqu'à présent, mais j'ai vu dans le forum 'défis' que ça pouvait peut être un début de solution)

    Si vous pouviez m'aider à trouver une piste...

    Merci

    ibill

    Ps : pour l'instant, j'ai fait 3 requetes sélection simples, une pour chaque classe, mais je n'arrive plus ensuite à utiliser des Count() et des Sum() pour avoir ce que je cherche...

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Si tu as déjà tes requêtes "simples", utilisent les comme tables dérivées, tu pourras alors faire ton Count sur tes champs.

    Le fait d'avoir 3 requêtes peu aussi te permettre de ne faire une recherche que sur une seul si un jour tu en as besoin...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    salut et merci...

    Qu'appelles tu table dérivée ?

    Mon probleme maintenant c'est que j'aimerai bien n'avoir qu'une seule requête pour faire les décomptes dans les 3 autres.

    Pour le moment, je n'arrive à le faire que sur une à la fois, avec le sql suivant (ici avec la requete 'z_nitrates_25_50' qui correspond à la classe "intermédiaire") :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Count(z_nitrates_25_50.ID_UD) AS CompteDeID_UD, Sum(z_nitrates_25_50.POPULATION) AS SommeDePOPULATION, Sum(z_nitrates_25_50.PopConcern) AS SommeDePopConcern
    FROM z_nitrates_25_50;
    Ou alors dois-je écrire un sql plus complexe avec des sous requetes imbriquées ? c'est vrai qu'avec QBE c'est un peu limité peut être pour ce que je veux obtenir :/

    Apres ce sera juste un pb de syntaxe (je ne suis pas trop habitué à imbriquer du SQL)...

    Voici le Select d'une de mes 3 requetes de regroupement de départ (elles sont toutes les 3 construites de la même manière, et déja la valeur de population totale de référence est prise dans une requête tierce) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT z_qry_UDPesticidesClasses_.ID_UD, z_qry_UDPesticidesClasses_.NOM_UD, z_qry_UDPesticidesClasses_.NOM_COLLECTIVITE, z_qry_UDPesticidesClasses_.PERIODE, z_qry_UDPesticidesClasses_.NITRATES, z_qry_UDPesticidesClasses_.POPULATION, z_qry_UDPesticidesClasses_!POPULATION*100/z_qry_tmp_SommePop!SommeDePOPULATION AS PopConcern
    FROM z_qry_UDPesticidesClasses_, z_qry_tmp_SommePop
    WHERE (((z_qry_UDPesticidesClasses_.PERIODE)="2004-2006") AND ((z_qry_UDPesticidesClasses_.NITRATES)>50));
    Je galère un peu avec toutes ces requêtes, c'est vrai que si je n'avais qu'une grosse instruction SQL bien construite ce serait mieux pour ceux qui s'en servent ensuite :/

    ibill

  4. #4
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Les tables dérivées ressemble à :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT T1.champs1, T2 .champs2
     
    FROM
           (SELECT...
                         ) T1,
           (SELECT...
                         ) T2
     
    -- Et tu finis...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Merci... je viens de le lire sur le post parallele de guillaume 78...

    Je vais voir déja en imbriquant de la sorte...

    ibill

  6. #6
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    L'utilisation d'une table dérivée et semblable à tout autre synthaxe (Normalement).

    Le fait de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT...
    FROM ( SELECT...
             ) T1
    cela signifie que tes champs inscrit dans T1 provienne de cette table car une clause FROM ne provient que d'une table (Le résultat d'une requête est une table), le nom importe peu et l'utilisation du SELECT reste le même, si tu veux mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT...
    FROM (SELECT TaTable.Ton champs AS TonAlias
             FROM...
             ) T1
    Dans ton premier SELECT tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT COUNT(T1.[TonAlias])...
    FROM (SELECT TaTable.Ton champs AS TonAlias
             FROM...
             ) T1
    J'espére avoir répondu correctement

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Très clair merci

    Par contre je sens que je vais encore me tirer un peu les cheveux...
    concretement, le résultat attendu est un tableau avec 3 enregistrements représentant chacun une catégorie correspondant à une plage de résultats d'analyse (mes 3 classes dont je parlais au debut du topic), avec comme colonnes le compte du groupe, la somme de la population correspondante et la somme du pourcentage calculé par une autre requete.

    Pour le moment, je n'arrive pas à aller plus loin qu'un enregistrement, ce qui m'oblige à faire 3 fois la requete et a coller manuellement les 3 lignes obtenues dans un tableau excel.

    J'ai essayé avec la fonction iif pour remplir une 4e colonne temporaire qui prendrait comme valeurs "moins de 0.5", "entre 0.5 et 1" et "plus de 1" pour pouvoir ensuite grouper sur ce champ, et là j'ai de belles erreurs...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Iif([TX_NI]<=0,5,"moins de 0.5","") , Iff([TX_NI]>0,5 AND [TX_NI]<=1,"entre 0.5 et 1",""),Iff([TX_NI]>1,"plus de 1","")
    où est l'erreur ? points, virgules ? impossibilité de faire cela directement dans une requete ? je ne comprend pas pourquoi je n'arrive pas à faire tourner cette requete...

    Manuellement j'aurai déja pondu 50 tableaux avec mes classes ainsi discretisées :s

    Encore un coup de pouce please !

  8. #8
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Il te dis quoi comme erreur

  9. #9
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut Chtulus et bienvenu ibill,
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    Iif([TX_NI]<=0.5,"moins de 0.5", Iif([TX_NI]>0.5 AND [TX_NI]<=1,"entre 0.5 et 1","plus de 1"))

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    "Le numéro de l'expression n'est pas valide", et il met le focus sur le premier 0,5 (celui du test du 1er Iif...<0,5)

    J'avais fait une coquille en tapant iff au lieu d'iif dans les 2 dernieres conditions, mais même apres correction ça ne marche pas !

    Voici l'expression entrée dans le champ du QBE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classe:Iif([TX_NI]<=0,5,"moins de 0.5","") , Iif([TX_NI]>0,5 AND [TX_NI]<=1,"entre 0.5 et 1",""),Iif([TX_NI]>1,"plus de 1","")
    EDIT : Autant pour moi Vodiem, je n'avais pas vu ta correction
    pas les yeux en face des trous moi ce matin :/

    Mais toujours pas résolu : erreur :
    "L'expression entrée comporte un point non valide (.) ou un point d'exclamation (!) ou des parenthèses () non valides
    Vous avez peut-être entré un identificateur non valide ou tapé des parenthèses après la constante Null."

    Quid ? surement un probleme avec cette virgule... le champ TX_NI est pourtant numérique, entier long à 2 décimales...

    Comprend pô

  11. #11
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    en QBE il faut aussi faire attention à la virgule qui est utilisée pour séparer les paramètres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classe: VraiFaux([TX_NI]<=(0,5),"moins de 0.5",VraiFaux(([TX_NI]>(0,5)) Et ([TX_NI]<=1),"entre 0.5 et 1","plus de 1"))
    (le code précédent c'est du SQL)

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Yeees...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Classe: VraiFaux([TX_NI]<=0,5;"moins de 0,5";VraiFaux([TX_NI]>1;"plus de 1";VraiFaux([TX_NI] Est Null;"null";"entre 0,5 et 1 ")))
    Avec des point-virgules pour séparer le tout, j'ai enfin réussi à avoir mes 3 classes !
    une partie du pb est résolu, si ce n'est que j'aimerai vraiment arriver à n'avoir qu'une grosse requête SQL - avec sous-requêtes- qui mache tout d'un coup...

    à suivre...

  13. #13
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Citation Envoyé par ibill Voir le message
    Bonjour,

    Je cherche à discretiser les données numériques d'une colonne en 3 classes :
    <=25 ; >25 AND <=50 ; >50 , en vue de pouvoir ensuite compter le nombre d'enregistrement dans chaque classe, et de calculer la population correspondante (en %, et qui serait en fait la somme des pourcentages des enregistrements regroupés...)

    Ps : pour l'instant, j'ai fait 3 requetes sélection simples, une pour chaque classe, mais je n'arrive plus ensuite à utiliser des Count() et des Sum() pour avoir ce que je cherche...
    Tu peux avoir le résultat en une seule requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT Sum(IIf([LeChamp]<=25,1,0)) AS Inf25, Sum(IIf([LeChamp]>25 And [LeChamp]<=50,1,0)) AS Entre25et50, Sum(IIf([LeChamp]>50,1,0)) AS Sup50
    FROM LaTable;

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Merci à tous, je testerai la dernière solution entre ce soir et demain, j'ai un autre dossier brulant à potasser :/

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    La solution de DMboup est intéressante, je vais approfondir avec l'imbrication...

    En attendant j'ai finalement fait une discretisation et obtenu mes totaux en 4 requetes :/ c'est lourd mais ça marche...

    La premiere sélectionne les données qui m'intéressent (filtrage avec WHERE) et crée des classes dans une colonne supplémentaire à l'aide de VraiFaux() ;
    La seconde regroupe, compte le nombre d'enregistrement par groupe et additionne les population des enregistrements concernés ;
    La 3ème fait les totaux des totaux de la seconde (1 seule ligne)
    Et enfin la 4eme s'appuie sur les 2 précédentes pour calculer les pourcentages...

    C'est fastidieux mais ça tourne

    Je met résolu mais franchement si il y'a des solutions plus légères (j'étais bien parti sur les requetes en sql avec imbrications, mais le QBE a eu raison de moi (et de mon temps dispo)

    A approfondir... en week end

    Merci encore

  16. #16
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    DMboup, je voulais pas tuer le poussin dans l'oeuf d'autant que Chtulus avait pris le temps soin de couver l'affaire.

    ibill> c'est plus fastudieux mais c'est plus sûr de procéder ainsi lorsqu'on débute.

    par contre, bien que les imbrications soit très performantes dans la mesure du possible utilise les fonctions de domaine qui sont plus facile à mettre en place.

    utilise donc DCount(), Dmin(), DMax(), DLookup() pour obtenir ta requete.
    je ne suis pas sur d'avoir bien compris l'ennoncé de ton prb donc je préfère m'abstenir, d'autant que je pense que tu as suffisamment d'élément pour y répondre.

    bonne continuation,

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

Discussions similaires

  1. Aide requete complexe
    Par Sabine78 dans le forum Access
    Réponses: 9
    Dernier message: 18/04/2006, 21h28
  2. requete complexe
    Par nicohugo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/03/2006, 08h10
  3. Requete complexe
    Par d1g-2-d1g dans le forum Langage SQL
    Réponses: 9
    Dernier message: 02/05/2005, 14h47
  4. Requete complexe
    Par Pfeffer dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/02/2005, 17h42
  5. requete complexe
    Par Thunder_nico dans le forum Langage SQL
    Réponses: 8
    Dernier message: 07/10/2004, 11h36

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