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 :

éliminer les doublons


Sujet :

Langage SQL

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 314
    Points : 217
    Points
    217
    Par défaut éliminer les doublons
    bonjour, j'ai une requête qui me retourne les listes des produits avec la somme de leurs quantité en stock. quelques produits peuvent avoir la même valeur de la référence , donc sur ma requête je veux récupérer seulement un produit qui parmi ceux qui ont le même Ref.
    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 DISTINCT (
    p.sku
    ), p.idproduit, sum( phsub.quantite ) AS qtock
    FROM produit p
    INNER JOIN produit_has_subzone phsub ON phsub.idproduit = p.idproduit
    INNER JOIN marque m ON m.idmarque = p.idmarque
    LEFT OUTER JOIN age a ON a.idage = p.idage
    LEFT OUTER JOIN genre g ON g.idgenre = p.idgenre
    WHERE p.idtype_produit = '124'
    AND p.archive = '-1'
    AND p.internet = '1'
    AND phsub.idstock_subzone != '8'
    AND phsub.idstock_subzone != '12'
    GROUP BY p.sku, p.idproduit
    ORDER BY `qtock` ASC
    ça me retourne plusieurs produit de même SKU ( référence).

  2. #2
    Invité
    Invité(e)
    Par défaut
    C'est normal tu fais ton Group By sur le SKU, fais-le sur seulement sur le produit.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 314
    Points : 217
    Points
    217
    Par défaut
    déjà fait , ça retourne toujours les doublons

  4. #4
    Invité
    Invité(e)
    Par défaut
    Il faut que tu utilises une fonction d'aggrégation sur le champ SKU du genre MIN() ou MAX() pour en avoir 1 seul sinon il retourne une ligne par SKU.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Tout d'abord votre requête contient de graves erreurs :
    L'utilisation d'apostrophe oblige un transtypage en CHAR des colonnes des tables ce qui empêche route utilisation d'index !
    Une valeur nombre ne s'écrit JAMAIS entre apostophe si la colonne est numérique.
    Exemple d'erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AND p.archive = '-1'
    AND p.internet = '1'
    AND phsub.idstock_subzone != '8'
    AND phsub.idstock_subzone != '12'
    L'opérateur de différence est <> et non !=
    Exemple d'erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AND phsub.idstock_subzone != '8'
    AND phsub.idstock_subzone != '12'
    Ensuite DISTINCT n'est pas une fonction. C'est un opérateur qui effecte le dédoublonnnement des lignes. Donc l'écriture :
    est illicite. Je m'étonne déjà que votre SGBDR l'accepte !

    Enfin pour résoudre élégamment votre problème, vous pouvez utiliser une fonction de fenêtrage du type ROW_NUMBER et surfiltrer en table dérivée :

    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
    SELECT sku, idproduit, qtock
    FROM   (SELECT ROW_NUMBER() OVER(PARTITION BY p.sku ORDER BY p.idproduit DESC) AS N, 
                   p.sku, p.idproduit, sum( phsub.quantite ) AS qtock
            FROM   produit p
                   INNER JOIN produit_has_subzone phsub 
                         ON phsub.idproduit = p.idproduit
                   INNER JOIN marque m 
                         ON m.idmarque = p.idmarque
                   LEFT OUTER JOIN age a 
                        ON a.idage = p.idage
                   LEFT OUTER JOIN genre g 
                        ON g.idgenre = p.idgenre
            WHERE  p.idtype_produit = 124
              AND  p.archive = -1
              AND  p.internet = 1
              AND  phsub.idstock_subzone <> 8
              AND  phsub.idstock_subzone <> 12
            GROUP  BY p.sku, p.idproduit) AS T
    WHERE  N = 1
    ORDER  BY qtock ASC
    Sur les fonctions de fenêtrage, sites aussi analytiques, voir cet excellent article : http://lalystar.developpez.com/fonctionsAnalytiques/

    A +

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 314
    Points : 217
    Points
    217
    Par défaut
    merci beaucoup SQLpro votre réponses est très riche , vous m'avez montrer des choses que j'ignorais sur le SQL .

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

Discussions similaires

  1. Distinct - éliminer les doublons
    Par chris801 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 28/03/2007, 00h22
  2. comment éliminer les doublons
    Par fk04 dans le forum Requêtes
    Réponses: 1
    Dernier message: 09/08/2006, 18h22
  3. Éliminer les doublons d'une BDD MySQL
    Par sansouna24 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 21/05/2006, 12h26
  4. Réponses: 2
    Dernier message: 12/05/2006, 09h35
  5. [sql] [oracle] éliminer les doublons dans sum ?
    Par trungsi dans le forum Langage SQL
    Réponses: 14
    Dernier message: 04/03/2005, 13h29

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