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

Développement SQL Server Discussion :

COUNT et affichage des données de la même colonne


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de dany13
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Par défaut COUNT et affichage des données de la même colonne
    Bonjour,

    j'ai un soucis avec une requête et je ne m'en sors pas!!!
    J'aimerai afficher dans une table "temporaire" une colonne ou il y aurait le resultat d'un COUNT et une colonne qui afficherait les données de cette colonne.

    Voici mon exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Table produits_historiques
    new_ref | old_ref
    -----------------
    8250      | 2134
    9520      | 1014
    8253      | 2134
    8560      | 2134
    Avec ma requete, j'aimerai creer une table temporaire qui me renvoyerait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Table Temporaire produits_historiques
    new_ref | old_ref | NBNEW
    --------------------------
    8250      | 2134   | 3
    9520      | 1014   | 1
    8253      | 2134   | 3
    8560      | 2134   | 3
    J'ai essayé cette requete pour ne sortir que les cas ou il n'y a qu'une seule nouvelle reference:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Select new_ref, old_ref, COUNT(new-ref) as NBNEW
    from produits_historiques
    group by old_ref
    having count(nbnew)=1
    J'ai besoin de récuperer les données de la colonne new_ref. Le problème est que sous sql serveur, il n'accepte pas cette requete car il m'oblige à mettre dans le group by la colonne new_ref en plus de old_ref. Et pour le coup, la requete n'est plus correcte

    AU SECOURS!!!!!!!

    Merci par avance de votre aide
    @++

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    C'est parfaitement normal. En effet vous ne pouvez pas avoir à la fois l'agrégat et le détail. Si vous faites un GROUP BY, cela réalise des sous ensembles (sous tables en quelques sortes) sur lesquelles porte le comptage.

    Si vous voulez à la fois le détail et l'agrégat, il faut utiliser une fonction de fenêtrage aussi appelé fonction analytique ou OLAP.
    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/article...clause-window/

    En particulier dans votre cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT new_ref, old_ref, COUNT(new-ref) OVER(PARTITION BY old_ref) AS NBNEW
    FROM produits_historiques

    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/ * * * * *

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 16
    Par défaut AKAROUCHE Mohamed
    Le code suivant correspond à la requete voulue :

    select new_ref, produits_historiques.old_ref, nouveau.NBNEW2 AS NBNEW
    from produits_historiques, (select old_ref, count(old_ref) AS NBNEW2 from produits_historiques
    group by old_ref) as nouveau
    where nouveau.old_ref = produits_historiques.old_ref

    ---------
    AKAROUCHE Mohamed

  4. #4
    Membre confirmé Avatar de dany13
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Par défaut
    Merci pour vos réponses

    Après vérification, SQL Pro, ta requete ne passe pas, elle me donne exactement le même resultat qu'avec celle ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT new_ref, old_ref, COUNT(new-ref) AS NBNEW
    FROM produits_historiques
    GROUP BY old_ref
    HAVING count(nbnew)=1
    Mais je ne connaissais pas cet astuce toutefois!!

    En revanche, akarouche mohamed, tu proposes quelques choses que je n'ai jamais fais ainsi et à ma surprise ça passe!!

    J'avais testé avec des requete imbriquées et IN pour m'en sortir, ça passe également.

    Mais pour le coup, en terme de perf, est ce mieux la requete de akarouche mohamed ou avec des IN imbriquées? Tout en sachant que ma table à une 50-100 de lignes

    Merci

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Vous êtes en quelle version de SQL Server ?
    La requête de SQLPro est correcte, vous avez dû mal l'implémenter :
    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
    DECLARE @Produits_historiques TABLE (id int IDENTITY, new_ref int, old_ref int);
     
    INSERT INTO @Produits_historiques
    SELECT 8250, 2134 UNION ALL
    SELECT 9520, 1014 UNION ALL
    SELECT 8253, 2134 UNION ALL
    SELECT 8560, 2134;
     
      SELECT new_ref, old_ref,
             COUNT(new_ref) OVER(PARTITION BY old_ref) AS nb_new
        FROM @Produits_historiques
    ORDER BY id ASC;
     
    new_ref     old_ref     nb_new
    ----------- ----------- -----------
    8250        2134        3
    9520        1014        1
    8253        2134        3
    8560        2134        3

  6. #6
    Membre confirmé Avatar de dany13
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Par défaut
    Waldar, je suis sous sql Serveur 2005.
    Je vais retester dans l'aprem et je vous tiens au courant
    merci

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

Discussions similaires

  1. Fusion des données dans une même colonne
    Par etu_multi dans le forum Webi
    Réponses: 8
    Dernier message: 13/03/2013, 10h52
  2. [XL-2007] Comparaison des données d'une même colonne
    Par taissi dans le forum Excel
    Réponses: 5
    Dernier message: 26/11/2011, 12h15
  3. Réponses: 3
    Dernier message: 06/02/2007, 11h04
  4. TDBCtrlGrid - Affichage des données
    Par audreyb dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/10/2004, 13h10
  5. [JTable] Problème d'affichage des données
    Par ddams dans le forum Composants
    Réponses: 2
    Dernier message: 15/09/2004, 17h07

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