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 :

[SQL Server] Une petite aide sur une requete


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Par défaut [SQL Server] Une petite aide sur une requete
    bonjour, je suis sous SQL Server 2005
    Voici ma table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MOIS ! LANGUE ! NOMBRE
     1   !   fr   ! 3
     1   !   be   ! 5
    ...
    Je voudrais avoir pour chaque mois, les 5 langues ayant le plus grand nombre.
    Comment puis je faire pour que ma requete retourne tout de suite ce résultat ?
    Merci de votre réponse

  2. #2
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Avec un "ORDER BY Nombre DESC" et un TOP 5, ça devrait le faire, non ?

    Ex de syntaxe pour TOP :
    http://www.developpez.net/forums/sho...&highlight=TOP

    (une recherche sur le mot-clé TOP dans ce forum te donnera plein de résultats )
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Je ne crois pas que cela va fonctionner, car apparement il/elle veut faire des groupes :

    Mois Langue Nombre
    ____________________
    1 fr 50
    1 es 30
    1 de 23
    1 uk 15
    1 cn 8
    2 es 33
    2 cz 32
    2 fr 15
    2 br 12
    ....

    Ce n'est donc pas une limite TOP dans le sens d'affichage, je pense qu'elle veut les x premiers résultats de chaque groupement par mois... Ce qui est deja beaucoup plus délicats

    Mais la encore, peut etre que j'ai mal compris la question

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Par défaut
    tu as très bien compris Yanika_bzh, et je sais qu'il faudra utiliser le TOP, mais je ne vois pas trop comment tourner la requete car je dois le grouper sur les mois...

    Edit:
    Je complique aussi la chose :
    Chacune des colonnes citées ci dessus ne sont mises directement dans une table mais calculée.

  5. #5
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    En une requête, ça me paraît difficile, surtout sans table pour la gestion des mois ...


    Voici une proposition de jeu d'essai pour indiquer une méthode de résolution du problème :

    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
    CREATE TABLE TEST (
    NumMois NUMBER (2),
    Langue VARCHAR2 (2),
    Nombre NUMBER (10));
     
     INSERT INTO TEST VALUES (1, 'ES', 3);
     INSERT INTO TEST VALUES (2, 'ES', 5);
     INSERT INTO TEST VALUES (3, 'ES', 1);
     INSERT INTO TEST VALUES (1, 'FR', 4);
     INSERT INTO TEST VALUES (2, 'FR', 8);
     INSERT INTO TEST VALUES (3, 'FR', 3);
     INSERT INTO TEST VALUES (1, 'BE', 7);
     INSERT INTO TEST VALUES (2, 'BE', 3);
     INSERT INTO TEST VALUES (3, 'BE', 6);
    ...
    COMMIT;
    Voici une requête qui fait ce qui est souhaité pour le mois n° 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT Langue, SUM(Nombre) AS Total
      FROM TEST
     WHERE NumMois = 1
     GROUP BY Langue
     ORDER BY SUM(Nombre) DESC;
     
    LA      TOTAL
    -- ----------
    BE          7
    FR          4
    ES          3
    Il suffit je pense de rajouter un TOP (non supporté par mon SGBD) pour limiter le nombre de résultats.

    Reste à boucler sur le mois. D'où le besoin d'une table de Mois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE Mois (
    Numero NUMBER (2),
    Libelle VARCHAR2 (16));
     
    INSERT INTO Mois VALUES (1, 'Janvier');
    INSERT INTO Mois VALUES (2, 'Février');
    INSERT INTO Mois VALUES (3, 'Mars');
    ...
    COMMIT;
    Voici une requête qui ramène pour chaque mois les langues les plus parlées :
    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
    SELECT Numero, Libelle, Langue, Total
      FROM Mois INNER JOIN
    (SELECT NumMois, Langue, SUM(Nombre) AS Total
      FROM TEST
     GROUP BY NumMois, Langue
    ORDER BY SUM(Nombre) DESC) ON NumMois = Numero
    ORDER BY Numero, Total DESC;
     
        NUMERO LIBELLE          LA      TOTAL
    ---------- ---------------- -- ----------
             1 Janvier          BE          7
             1 Janvier          FR          4
             1 Janvier          ES          3
             2 Février          FR          8
             2 Février          ES          5
             2 Février          BE          3
             3 Mars             BE          6
             3 Mars             FR          3
             3 Mars             ES          1
    Manque le TOP par mois, qu'il n'est pas possible d'insérer dans le sous-requête vu qu'il y a tous les mois dedans ...

    Bref, à ta place, je gérerais les ruptures de mois hors SQL. Désolé de ne pouvoir t'aider plus, plus de temps
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Par défaut
    Merci de ton aide Xo, mais je suis arrivé au même résultat que toi ... En gros, grace à des requetes, j'obtiens ton dernier résultat... Mais je me demande s'il n'est pas possible, dans une requete imbriqué, de ne demander qu'un certain nombre d'éléments ( grace au TOP ) pour chacun des mois.

    Je pense que c'est difficilement réalisable mais peut être faisable.

    Voici la requete a laquelle je pensais :
    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
     
    SELECT COUNT(opd1.newsletter_id) AS nb,
    UPPER( LEFT(opd1.newsletter_language, 2)) as langue, 
    MONTH(opd1.newsletter_datetime) as mois 
    FROM   table opd1
    WHERE  DATEDIFF("mm", opd1.newsletter_datetime, getdate() ) <= 5 AND EXISTS (  
       SELECT TOP 5 COUNT(opd2.newsletter_id),
       UPPER( LEFT(opd2.newsletter_language,2)),
       MONTH(opd2.newsletter_datetime)
       FROM table opd2 
       WHERE MONTH(opd1.newsletter_datetime) = MONTH(opd2.newsletter_datetime)
       AND DATEDIFF("mm", opd2.newsletter_datetime, getdate() ) <= 5
       GROUP BY MONTH(opd2.newsletter_datetime), UPPER(LEFT(opd2.newsletter_language,2))
       ORDER BY COUNT(opd2.newsletter_id) DESC )
    GROUP BY MONTH(opd1.newsletter_datetime), 
    UPPER( LEFT(opd1.newsletter_language, 2)) 
    ORDER BY MONTH(opd1.newsletter_datetime)
    Mais malheureusement, elle ne me donne pas le résultat voulu. Peut être que j'ai fait une erreur.

Discussions similaires

  1. [Unity 5] Besoin d'une petite aide pour une animation
    Par mathisdu42 dans le forum Unity
    Réponses: 13
    Dernier message: 01/05/2015, 19h49
  2. Réponses: 3
    Dernier message: 25/10/2007, 11h47
  3. petite aide sur une macro pour transfere de valeur
    Par fpouzou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/06/2007, 16h54
  4. petite aide sur une requete INSERT INTO
    Par bonneti dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/03/2005, 15h17
  5. copier une petite texture sur une grosse texture
    Par gaut dans le forum DirectX
    Réponses: 5
    Dernier message: 15/10/2004, 22h12

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