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] alternative au SELECT MAX( COUNT(*) )


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut [SQL Server] alternative au SELECT MAX( COUNT(*) )
    Bonjour, je suis coincé sur une requete que je n'arrive pas a finaliser...
    En gros voila la table en question. Elle est generee par une requete avec un select count afin d'obtenir par machine (01d...) le nom du user connecté et combien de fois.
    Ce que je voudrais c'est , lorsqu'il existe 2 users pour une meme machine (07d), n'afficher la ligne que de celle avec le user s'etant connecté le plus..
    Etant en MSSQL, le select max(count(*)) ne fonctionne malheureusement pas...

    Pouvez vous m'aider à trouver la requete sur la table ci dessous qui em permettrait cela ?

    Merci d'avance

    01d userinit.exe toto 174
    02d userinit.exe titi 122
    03d userinit.exe paul 52
    04d userinit.exe mac 110
    05d userinit.exe noel 66
    06d userinit.exe charles 64
    07d userinit.exe leo 16
    07d userinit.exe simon 14
    08d userinit.exe pierre 165

  2. #2
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Points : 171
    Points
    171
    Par défaut
    Bonsoir,

    Est'il possible de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select ...max(
    from (select ... )
    Si oui c'est facile.

    Cdt

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    oui cette requette est possible mais j'ai essayé dans tous les seens et je n'y parviens pas...
    Pouvez vous me guider ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Salut,

    tu peux peut-être essayer ça (en admettant que tes champs se nomment Info1, Info2, Info3 et Info4) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM NomTable AS T1
    WHERE Info4 = (SELECT MAX(Info4) FROM NomTable AS T2 WHERE T2.Info1 = T1.Info1)
    ORDER BY Info1
    Cela peut marcher si les noms de tes machines (Info1 = 01d, 02d, ...) sont uniques.

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Testé sur Oracle mais qu'en pensez-vous ?

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    10g SOC5> CREATE TABLE DVP (
      2    ID_USER         VARCHAR2(3),
      3    NOM_USER        VARCHAR2(50),
      4    NB_CONNEXIONS   NUMBER(12) );
     
    Table créée.
     
    10g SOC5> 
    10g SOC5> INSERT INTO DVP VALUES ('01D', 'TOTO',    174);
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('02D', 'TITI',    122);
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('03D', 'PAUL',    52);
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('04D', 'MAC',     110);
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('05D', 'NOEL',    66);
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('06D', 'CHARLES', 64);
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('07D', 'LEO',     16);
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('07D', 'SIMON',   14);
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('08D', 'PIERRE',  165);
     
    1 ligne créée.
     
    10g SOC5> 
    10g SOC5> SELECT D.ID_USER, NOM_USER, NB_CONNEXIONS
      2  FROM ( SELECT   ID_USER
      3         FROM     DVP
      4         GROUP BY ID_USER
      5         HAVING   COUNT(*) > 1 ) T,
      6        DVP D
      7  WHERE T.ID_USER = D.ID_USER
      8  AND   D.NB_CONNEXIONS = ( SELECT MAX(NB_CONNEXIONS)
      9                            FROM   DVP D2
     10                            WHERE  D.ID_USER = D2.ID_USER );
     
    ID_ NOM_USER                                           NB_CONNEXIONS
    --- -------------------------------------------------- -------------
    07D LEO                                                           16
     
    1 ligne sélectionnée.
    Remarque : je n'ai pas poussé mon raisonnement mais à mon avis il est possible de n'utiliser qu'une sous-requête et non la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ...
    FROM ( SELECT ... )
    qui n'est pas supportée par tous les SGBD...

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT MAX(COLONNE_X)
    FROM (SELECT COUNT(*) AS COLONNE_X
             FROM MATABLE ) AS T
    N'oubliez pas le AS T car la table soit être nommée !

    A +

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par SQLpro
    N'oubliez pas le AS T car la table soit être nommée !
    Vous voulez dire que le mot clé AS est indispensable selon la norme SQL ?

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Perso je suis sur MSSQL donc je ne pense pas que la requete oracle fonctionnera mais ca me donne un fil conducteur.
    Je vais essayer la requete de charles72 pour voir ce que ca donnne.
    Je vous tiens au courant

    et oui je crois que le AS est indispensable sinon on recupere des erreurs de synthaxe.

    Merci

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par xtotoro
    Perso je suis sur MSSQL donc je ne pense pas que la requete oracle
    Je n'ai introduit aucun élément qui ne fonctionnerait pas sur votre SGBD s'il supporte la syntaxe où une requête SELECT figure dans la clause FROM !

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Je n'arrive pas à faire fonctionner la requete ci dessus..
    Pour info le tableau que j'ai mentionné est issu de cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select sd.name0 as Computername, sf.filename as FileName,
    mu.fullname as UserName,ud.fullname0 as FullName, count(*) as Counter
    from meterdata md inner join system_disc sd on md.systemitemkey = sd.itemkey
    inner join softwarefile sf on md.fileid = sf.fileid
    inner join meteredusers mu on md.metereduserid = mu.metereduserid
    inner join user_disc ud on mu.Fullname = ud.unique_user_name0
    where sf.filename='userinit.exe'
    group by sd.name0,sf.filename,mu.username,mu.domain,mu.fullname, ud.fullname0
    et en fait je voudrais imbriquer cette requete en 'sous requete' de maniere à ce que je ne sorte que des distinct machines et pour ces machines uniques, le user s'etant le plus connecté.

    ex :

    Passer de ma requete actuelle :
    01d userinit.exe toto 174
    02d userinit.exe titi 122
    03d userinit.exe paul 52
    04d userinit.exe mac 110
    05d userinit.exe noel 66
    06d userinit.exe charles 64
    07d userinit.exe leo 16
    07d userinit.exe simon 14
    08d userinit.exe pierre 165

    à ce que je veux :
    01d userinit.exe toto 174
    02d userinit.exe titi 122
    03d userinit.exe paul 52
    04d userinit.exe mac 110
    05d userinit.exe noel 66
    06d userinit.exe charles 64
    07d userinit.exe leo 16
    08d userinit.exe pierre 165

    et vu la requete initiale dejà bien lourde, j'avoue que je me perds un peu.

    En attendant vos lumieres,
    Cordialement

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    Ce n'est pas le AS qui est indispensable c'est le nom de la table. Lorsque vous faîtes des requêtes en tables dérivées (dans la clause FROM) vous devez donner un nom à la table qui est produite par cette requête.

    DONC :
    ou
    A +

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Pour info, j'avance un peu : j'arrive a sortir ce que je veux mais seulement sur 2 colonnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select t.Computername, max(t.Counter) from (
    select sd.name0 as Computername, sf.filename as FileName,
    mu.fullname as UserName,ud.fullname0 as FullName, count(*) as Counter
    from meterdata md inner join system_disc sd on md.systemitemkey = sd.itemkey
    inner join softwarefile sf on md.fileid = sf.fileid
    inner join meteredusers mu on md.metereduserid = mu.metereduserid
    inner join user_disc ud on mu.Fullname = ud.unique_user_name0
    where sf.filename='userinit.exe'
    group by sd.name0,sf.filename,mu.username,mu.domain,mu.fullname, ud.fullname0) as t
    group by t.Computername
    Ca me donne :
    01d 174
    02d 122
    03d 52
    04d 110
    05d 66
    06d 64
    07d 16
    08d 165

    le probleme c'est que je n'arrive pas à avoir le user avec (ma requete plante si j'insere les autres colonnes dans le select et le group by final...

Discussions similaires

  1. [SQL Server] select max d'un count ?
    Par chess75 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 28/08/2017, 14h38
  2. Problème: select max(count())
    Par zizou1989 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 14/05/2013, 16h31
  3. Réponses: 6
    Dernier message: 05/12/2006, 10h28
  4. Sybase -> SQL Server : pblm de SELECT
    Par vincenteraptor dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/09/2006, 12h42

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