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

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 43
    Points
    43
    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é
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    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 expérimenté 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
    Points : 1 738
    Points
    1 738
    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
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 43
    Points
    43
    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é
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    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 du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 43
    Points
    43
    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.

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select a.NumMois, a.Langue, a.Nombre
    from dvp_top a inner join dvp_top b 
                         on  a.NumMois = b.NumMois
                         and a.Nombre <= b.Nombre
    group by a.NumMois, a.Langue, a.Nombre
    having count(*) <= 2
    order by NumMois, a.Nombre desc;
    J'ai repris le jeu d'essai de XO, donc difficile de mettre 5 mais c'est facile à adapter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Mois Langue Nombre
    1    BE     7
    1    FR     4
    2    FR     8
    2    ES     5
    3    BE     6
    3    FR     3
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Merci Médiat de ton aide, mais je ne peut pas faire de jointure, car si tu regardes ce que j'ai mis précedemment, je dois calculer les valeurs, à moins que l'on peut joindre des colonnes calculées, mais cela je ne sais pas faire ...

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par irenee
    Merci Médiat de ton aide, mais je ne peut pas faire de jointure, car si tu regardes ce que j'ai mis précedemment, je dois calculer les valeurs, à moins que l'on peut joindre des colonnes calculées, mais cela je ne sais pas faire ...
    Un "SELECT" est une pseudo table, tu peux faire des jointures dessus, essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT TableA.ChampA, TableB.ChampB
      FROM TableA INNER JOIN (SELECT monChamp AS ChampB, idA AS champA
                       FROM MaTable ...) TableB
      ON TableA.ChampA = TableB.champA
    WHERE ...
    "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

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Voici la solution :


    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
     
    CREATE TABLE T_TEST_LANGUE_TLG 
    ( TLG_MOIS   INT ,
      TLG_LANGUE VARCHAR (2),
      TLG_NOMBRE INT );
     
    SELECT * FROM T_TEST_LANGUE_TLG
    ORDER BY 1, 3 DESC
     
     INSERT INTO T_TEST_LANGUE_TLG VALUES (1, 'ES', 3);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (2, 'ES', 5);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (3, 'ES', 1);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (1, 'FR', 4);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (2, 'FR', 8);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (3, 'FR', 3);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (1, 'BE', 7);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (2, 'BE', 3);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (3, 'BE', 6);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (1, 'DK', 3);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (2, 'DK', 6);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (3, 'DK', 2);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (1, 'GB', 1);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (2, 'GB', 7);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (3, 'GB', 8);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (1, 'RU', 1);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (2, 'RU', 2);
     INSERT INTO T_TEST_LANGUE_TLG VALUES (3, 'RU', 1);
     
     
     
    SELECT T1.TLG_MOIS, T1.TLG_LANGUE, T1.TLG_NOMBRE,
           COUNT(ALL T2.TLG_NOMBRE) AS CLASSEMENT
    FROM   T_TEST_LANGUE_TLG T1
           INNER JOIN T_TEST_LANGUE_TLG T2
                 ON  T1.TLG_MOIS = T2.TLG_MOIS
                    AND T1.TLG_NOMBRE <= T2.TLG_NOMBRE
    GROUP  BY T1.TLG_MOIS, T1.TLG_LANGUE, T1.TLG_NOMBRE
    HAVING COUNT(ALL T2.TLG_NOMBRE)  <= 5
    ORDER  BY 1, 4

    Notez qu'il est impossible de dire EXACTEMENT 5 car il se peut qu'il y ait des ex aecquo. Or l'informatique étant déterministe, on ne peut prendre pierre sans prendre jacques si les critères sont les mêmes.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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