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 :

SELECT suivant le nombre de lignes d'une colonne [2012]


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Points : 14
    Points
    14
    Par défaut SELECT suivant le nombre de lignes d'une colonne
    Bonjour à tous,

    Je viens vers vous aujourd'hui pour m'aider à résoudre ce petit problème.

    J'ai une table de liaison que voici:
    id id2
    1 1
    6 1
    7 2
    8 2
    8 3
    9 1
    9 2
    10 1
    11 1
    11 3

    J'aimerai faire un SELECT des id qui n'apparaisent qu'une fois et dont l'id2 = 1. En gros, je voudrais ça:
    id id2
    1 1
    6 1
    10 1

    Avez vous des idées comment faire?
    Merci d'avance

    PS: j'ai essayer cette requete, mais je n'ai que la première partie de mon problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id, id2 FROM table
    WHERE idjeux = 7
    GROUP BY id
    HAVING COUNT(id2) = 1

  2. #2
    Membre régulier
    Homme Profil pro
    Chef de projet BI
    Inscrit en
    Août 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Chef de projet BI

    Informations forums :
    Inscription : Août 2013
    Messages : 42
    Points : 82
    Points
    82
    Par défaut
    J'espère avoir compris ton besoin, je pense qu'il te faut utiliser une sous requête du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT ID1, ID2
    FROM TABLE
    WHERE ID1 IN (SELECT ID1
                  FROM TABLE
                  GROUP BY ID1
                  HAVING COUNT(ID1) = 1)
    AND ID2 = 1

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Pas besoin de faire de jointure avec le sous-select.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select *
    from (
      SELECT ID1
      FROM TABLE
      GROUP BY ID1
      HAVING COUNT(ID1) = 1
    ) tmp
    where tmp.id = 1
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    ou sans sous requête, donc peut-être un peu plus performant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT 
    	id1, 1 as id2
    FROM LaTable
    GROUP BY id1
    HAVING COUNT(*) = 1
    AND MAX(CASE WHEN id2 = 1 THEN 1 END) = 1

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Effectivement

    Cependant, avec SQL Server 2014, j'ai été très surpris tout à l'heure de voir qu'une auto-jointure sur une sous-requête faisait un plan d'exécution avec une seule lecture dans la table.

    Du coup, je me demande si avec SQL Server 2014, si ça se trouve, on a le même plan d'exécution pour les 3 requêtes
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    En fait, j'utiliserai cette requete déjà en tant que sous-requete.
    Ca va faire lourd si je mets une seconde sous requete non?

    Merci aieeeuuuuu, je vais prendre cette requete là

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    Dernière question,
    Si je veux uniquement ceux qui ont deux lignes, j'ai repris la requete de aieeeuuuuu, mais est-ce qu'il y a plus simple?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT id1
    FROM MaTable
    GROUP BY id1
    HAVING COUNT(*) = 2
    AND MAX(CASE WHEN id2 = 1 THEN 1 END) = 1
    AND MAX(CASE WHEN id2 = 3 THEN 3 END) = 3

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    avant toute chose, j'avais supposé une contrainte d'unicité sur le couple [id1, id2]... est-ce bien le cas ? (sinon, les requêtes sont à revoir)

    Il y a certes quelques variantes, mais qui ne changeront pas grand chose :

    par exemple (toujours en supposant la contrainte d'unicité) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT id1
    FROM MaTable
    GROUP BY id1
    WHERE SUM(CASE WHEN id2 IN (1,3) THEN 1 ELSE - 1 END) = 2

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    en fait, mes id1 correspondent à l'id d'articles, et les id2 à leurs fournisseurs.

    donc chaque article à un ou plusieurs fournisseurs. et quand je les filtres suivant l'ids des articles, je veux soit ceux qui ont un unique fournisseur soit ceux qui en ont deux (suivant le choix fait lors du filtre).

    voici ma requete entière, ça peut être plus simple:
    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
    --Filtre sur les articles n'ayant qu'un fournisseur
    SELECT a.idArticle, a.idUser, u.nom + ' ' + u.prenom AS user, a.article, a.idCatArt, ca.categorieArticle, a.description,a.motCle,cast(@admin as bit) AS visible
    FROM sites AS s
    INNER JOIN users AS u ON a.idUser = u.idUser
    INNER JOIN categorieArticles ca on a.categorieArticle= ca.categorieArticle
    WHERE a.idArticle in (
     SELECT idArticle FROM articles_fournisseurs 
     GROUP BY idArticle 
     HAVING COUNT(*) = 1
     AND MAX(CASE WHEN idFournisseurs  = 1 THEN 1 END) = 1)
    ORDER BY user ASC;
     
    --Filtre sur les articles ayant deu fournisseurs uniquement
    SELECT a.idArticle, a.idUser, u.nom + ' ' + u.prenom AS user, a.article, a.idCatArt, ca.categorieArticle, a.description,a.motCle,cast(@admin as bit) AS visible
    FROM sites AS s
    INNER JOIN users AS u ON a.idUser = u.idUser
    INNER JOIN categorieArticles ca on a.categorieArticle= ca.categorieArticle
    WHERE a.idArticle in (
     SELECT idArticle FROM articles_fournisseurs 
     GROUP BY idArticle 
     SUM(CASE WHEN idFournisseurs IN (1,3) THEN 1 ELSE - 1 END) = 2
    ORDER BY user ASC;
    Sinon, je n'ai qu'une clé primaire sur mes idArticles.

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

Discussions similaires

  1. [Excel][VB.NET] Nombre de ligne dans une colonne
    Par hunteshiva dans le forum VB.NET
    Réponses: 1
    Dernier message: 11/11/2011, 21h57
  2. [XL-2007] connaître le nombre de ligne dans une colonne
    Par EFFLYINGJOKER dans le forum Excel
    Réponses: 3
    Dernier message: 17/05/2011, 09h08
  3. nombre de lignes contenant une colonne dans une feuille
    Par bonanos dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/07/2009, 16h43
  4. Etirer une formule suivant le nombre de ligne d'une autre feuille
    Par S l i d e dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 11/08/2007, 23h45
  5. Nombre de lignes <> '' dans une colonne Excel
    Par zemeilleurofgreg dans le forum Delphi
    Réponses: 5
    Dernier message: 10/07/2007, 15h22

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