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

MS SQL Server Discussion :

Comment faire un Count() sans un group by interminable ?


Sujet :

MS SQL Server

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Comment faire un Count() sans un group by interminable ?
    Bonjour

    Est-il possible en MS SQL de faire un count sur un champ sans etre obligé d'integere tous les chmaps du select dans le group by

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Select 
    c1,
    count(c1),
    c2,
    c3,
    c4,
    .... etc
    from T
    group by c1;
    Comment peut on faire cela de maniere simple en MS SQL

    Il semblerait que ce soit impossible ??

    Merci de votre aide

  2. #2
    Membre actif
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Points : 269
    Points
    269
    Par défaut
    non ce n'est pas possible car count est une fonction d'agrégat qui permet de calculer le nombre d'éléments présents dans le sous ensemble rassemblant toutes les lignes d'information qui ont en commun les valeurs issus des colonnes du group by (ie l'étiquette du sous ensemble).

  3. #3
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    J'aurai dit comme jero44, mais j'avais peur de dire une bêtise...

  4. #4
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci pour ta réponse !
    Franchement c'est plus simple en MySql

    Pour contourner cette difficulté quelle est la bonne Syntaxe MS SQL pour combiner les deux query ci-apres afin de prendre dans le premier le count calculé dans le deuxième ?


    Je finirai bien par m'habituer a MS Sql

    Merci pour votre aide


    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
    -- Query 1
    SELECT 
    PersID AS PersID,
    PersNom AS Nom,
    PersPrenom AS Prenom,
    PersSexID AS Sex,
    PaysNomFR AS Nationalite,
    PersGSM AS Mobile,
    PersTel AS Tel,
    PersEmail AS Email
    FROM Personnes_tbl
    INNER JOIN Link_Contacts_tbl ON PersID = CtacPersID 
    LEFT OUTER JOIN Pays_tbl ON PersNationID = PaysID 
     
     
    -- Query 2
    SELECT PersID,
    count(PersID) as cnt 
    FROM Personnes_tbl
    INNER JOIN Link_Contacts_tbl ON PersID = CtacPersID 
    group by PersID

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Citation Envoyé par olibara Voir le message
    Merci pour ta réponse !
    Franchement c'est plus simple en MySql
    Non c'est grossière erreur de MySQL de permettre cette syntaxe, qui ne fonctionne que chez eux et qui est bien énigmatique.

    Comme l'a précisé jaro44, la fonction d'aggrégat se fait par rapport aux éléments du group by.
    Puis viennent les éléments du select pour l'affichage des données.

    Pour votre requête, ne connaissant pas vos données, à priori ceci devrait répondre à vos besoins :
    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
    SELECT 
        PersID AS PersID,
        PersNom AS Nom,
        PersPrenom AS Prenom,
        PersSexID AS Sex,
        PaysNomFR AS Nationalite,
        PersGSM AS Mobile,
        PersTel AS Tel,
        PersEmail AS Email,
        count(*) AS cnt 
    FROM
        Personnes_tbl
        INNER JOIN Link_Contacts_tbl
          ON PersID = CtacPersID 
        LEFT OUTER JOIN Pays_tbl
          ON PersNationID = PaysID
    GROUP BY
        PersID,
        PersNom,
        PersPrenom,
        PersSexID,
        PaysNomFR,
        PersGSM,
        PersTel,
        PersEmail

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci

    Oui effectivement la syntaxe que tu propose fonctionne
    Mais en l'occurence je ne souhaite faire qu'un count des PersID distinct, donc dans ce cas etre obligé d'inclure dans le group by tous les element du select ne me donnera pas le resultat attendu et je vais devoir faire un select secondaire pour calculer le count (et je n'ai pas encore bien trouvé la syntaxe)

    En MySQL c'est tres simple

    Voici un exemple elementaire qui'il est donc impossible de faire en MS Sql sans faire un select count temporaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
    count(addrid),
    ritstat.`date`,
    ritstat.addrID
    FROM
    ritstat
    group by (addrid)
    J'ai le count des dates sur une adresse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
    count(date),
    ritstat.`date`,
    ritstat.addrID
    FROM
    ritstat
    group by (date)
    J'ai le count des adresses sur une date

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Essayez ainsi dans ce cas :
    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
    SELECT 
        PersID AS PersID,
        PersNom AS Nom,
        PersPrenom AS Prenom,
        PersSexID AS Sex,
        PaysNomFR AS Nationalite,
        PersGSM AS Mobile,
        PersTel AS Tel,
        PersEmail AS Email,
        count(*) over(partition by PersID) AS cnt 
    FROM
        Personnes_tbl
        INNER JOIN Link_Contacts_tbl
          ON PersID = CtacPersID 
        LEFT OUTER JOIN Pays_tbl
          ON PersNationID = PaysID

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Waldar

    Ceci me donne

    Msg 156, Level 15, State 1, Line 10
    Incorrect syntax near the keyword 'over'.

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Vous êtes en SQL Server 2000 ?

  10. #10
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Helas oui !

Discussions similaires

  1. Comment faire un count distinct ?
    Par Kloun dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 29/11/2006, 14h33
  2. Réponses: 4
    Dernier message: 28/07/2006, 11h26
  3. Réponses: 14
    Dernier message: 27/07/2006, 14h40
  4. Comment faire un count de colonnes null
    Par claralavraie dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/01/2006, 14h13
  5. [Message] Comment faire un prompteur sans bruit
    Par Kylen dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 26/08/2005, 11h15

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