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 :

Plusieurs requêtes en une seule


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 233
    Points : 107
    Points
    107
    Par défaut Plusieurs requêtes en une seule
    Bonjour,

    Veuillez avant tout excuser mon inexpérience en SQL...

    J'ai une requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT count(login) AS 100_80
      FROM stats
     WHERE ( prct <= 100 AND prct >= 80 )
    Elle me permet de compter le nombre d'utilisateur dont le quota disque utilisé se situe en 80 et 100%

    J'interroge mon script via requete AJAX et j'aimerais l'interroger 5 fois pour les tranches 100-80,80-60,...,20-0

    Le probleme c'est que qu'en fonction de la rapidité d'execution des requetes, ou autres problemes , mes requetes n'arrivent pas dans l'ordre que j'ai demandé.

    Pour résoudre ce probleme, je me dit qu'il faudrait n'avoir qu'une seule requete qui me retourne un tableau du genre :
    100_80 |  82
     80_60 | 116
     60_40 |  94
     40_20 | 172
     20_00 | 452
    Je pourrais très bien faire une fonction qui interroge 5 fois la requete et construire mon tableau en PHP mais je me demande si il est possible de le faire directement en SQL.

    D'avance , merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    oui c'est possible, un exemple à adapter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select ma_col_group, 
    sum(case when ma_con between val_basse and val_haute then 1 else 0) as ..,
    sum(...) as,
    from ma_table
    group by ma_col_group

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ou même une petite opération mathématique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      SELECT floor(prct / 20) * 20 as borne
           , count(login) as nb
        FROM stats
    GROUP BY floor(prct / 20) * 20
    ORDER BY 1 desc;

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 233
    Points : 107
    Points
    107
    Par défaut
    Je n'arrive pas a faire fonctionner le type de requete de punkoff ( J'ai regardé mon bouquin , ta requete ressemble a un melange de requete classique et de programmation procedurale).

    Pour waldar, la requete fonctionne mais les resultats sont legerement differents des miens.

  5. #5
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Une petite remarque : lorsque tu as une valeur qui est égale à une borne (20-40-60-80) alors celle-ci se retrouve dans deux intervalles.

    Exemple : 20 va se trouver dans l'intervalle 00_20 et 20_40.

    Ceci explique certainement les écarts trouvés avec la requête de Waldar.
    ~ Lola ~

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par boutmos Voir le message
    Je n'arrive pas a faire fonctionner le type de requete de punkoff ( J'ai regardé mon bouquin , ta requete ressemble a un melange de requete classique et de programmation procedurale).

    Pour waldar, la requete fonctionne mais les resultats sont legerement differents des miens.
    Et moi je ne vois pas comment vous aidez si vous dites seulement "ca ne marche pas".

    idem pour la requête de Waldar, développez un minimum vos cas de test + requêtes utilisées (bien que lola06 ai bien analysé le problème ici)

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 233
    Points : 107
    Points
    107
    Par défaut
    OK merci, j'ai malheureusement besoin de plus de precision.

    Par contre , je n'arrive pas a comprendre la logique du

    floor(prct/20) * 20 AS borne

    comment ce bout de code peut il a partir de ma colonne prct reconstruire des interval de 20 .... ???

    @punkoff : je re test ton exemple et promis je developpe un peu plus sur quoi çà bloque. Dsl.

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 233
    Points : 107
    Points
    107
    Par défaut
    Alors j'ai fais cette requete sans etre bien sur d'avoir tout compris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT prct,
    SUM(case when prct BETWEEN 80 AND 100 then 1 else 0) AS 80_100,
    sum(case when prct BETWEEN 60 AND 80 then 1 else 0) AS 60_80,
    sum(case when prct BETWEEN 40 AND 60 then 1 else 0) AS 40_60,
    sum(case when prct BETWEEN 20 AND 40 then 1 else 0) AS 20_40,
    sum(case when prct BETWEEN 0 AND 20 then 1 else 0) AS 0_20,
    FROM stats
    GROUP BY prct
    phpmyadmin me retourne :

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') AS 80_100, sum(case when prct BETWEEN 60 AND 80 then 1 else 0) AS 60_80, sum(c' at line 2
    la structure de ma table est

    Colonne
    login (clé)
    grp
    used
    max
    prct

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Il manque juste un END à la fin des expressions CASE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(case when prct BETWEEN 80 AND 100 then 1 else 0 END) AS 80_100,
    Edit : Et il y a une virgule en trop avant le FROM
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par boutmos Voir le message
    Par contre , je n'arrive pas a comprendre la logique du floor(prct/20) * 20 AS borne
    Rien de très compliqué. Floor c'est l'arrondi inférieur.
    Prenons quelques exemples :
     Nb  Nb / 20  Arrondi_inf  Arrondi * 20
    --- -------- ------------ -------------
      0     0               0             0
      5     0.25            0             0
     10     0.5             0             0
     15     0.75            0             0
     20     1               1            20
     25     1.25            1            20
     30     1.5             1            20
     35     1.75            1            20
     40     2               2            40
     45     2.25            2            40
     50     2.5             2            40

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 233
    Points : 107
    Points
    107
    Par défaut
    Merci a Al1_24 d'avoir corrigé ma requete, celle ci fonctionne très bien a present et les resultats sont exacts.

    Merci a waldar pour ton explication, dont j'avais eu la reponse en y reflechissant avec mon collegue pendant qu'on faisait la queue pour voter le nouveau conseil de notre université ^^

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/01/2014, 18h45
  2. Optimisation de plusieurs requêtes en une seule ?
    Par Christophe Charron dans le forum Requêtes
    Réponses: 0
    Dernier message: 24/10/2009, 12h42
  3. Plusieurs requêtes en une seule ?
    Par tintin72 dans le forum Débuter
    Réponses: 15
    Dernier message: 18/08/2009, 17h28
  4. [AC-2007] Plusieurs requêtes dans une seule liste déroulante
    Par Razorback dans le forum IHM
    Réponses: 5
    Dernier message: 29/04/2009, 14h09
  5. Regrouper plusieurs requêtes en une seule?
    Par kabkab dans le forum Requêtes
    Réponses: 12
    Dernier message: 28/07/2007, 11h54

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