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

MySQL Discussion :

Filtrer une colonne 'AS' suite à un COUNT.


Sujet :

MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2022
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Filtrer une colonne 'AS' suite à un COUNT.
    Bonjour ! Je suis tout nouveau sur SQL Management Studio. J'utilise la base de donnée relationnelle AdventureWorks2019 (si ça peut mieux aiguiller).

    Premièrement, voici ma requête :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
    	DISTINCT pp.ProductID,
    	TRIM(CONCAT(pp.[Name], ' ', '(', pp.ProductNumber, ')')) as 'Description du produit',
    	pp.Color as 'Couleur',
    	COALESCE(d.Title, 'Pas de documentation disponible') as 'Titre du document',
    	COUNT(sod.OrderQty) over (partition by pp.ProductID) as 'Nombre de fois que le produit a été vendu',
    	FORMAT(AVG(sod.LineTotal) over (partition by pp.ProductID), 'c', 'en-us') as 'Moyenne des ventes' 
    FROM Production.Product pp
    	LEFT JOIN Production.ProductDocument ppd on ppd.ProductID = pp.ProductID
    	LEFT JOIN Production.Document d on d.DocumentNode = ppd.DocumentNode
    	INNER JOIN Sales.SalesOrderDetail sod on sod.ProductID = pp.ProductID
    ORDER BY pp.ProductID;


    Question : Je veux pouvoir filtrer la colonne 'Nombre de fois que le produit a été vendu' pour ne garder que les produits qui ont un COUNT > 10. J'ai essayé avec la clause HAVING (HAVING [Nombre de fois que le produit a été vendu] > 100), mais ça ne fonctionne pas. Quelqu'un aurait une idée ?

    Merci grandement pour votre aide !

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    bonjour,
    La clause HAVING s'applique sur le résultat du regroupement, il faut donc ajouter un GROUP BY cohérent avec les colonnes du SELECT et supprimer la clause DISTINCT

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2022
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Merci pour votre retour ! En fait, lorsque j'insère la clause Group By (et que je retire DISTINCT) il y a un message d'erreur.

    À la fin de mon code, si j'inscris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GROUP BY pp.ProductID
    HAVING COUNT(sod.OrderQty)  --- Avec ou sans  la partie OVER
    message d'erreur :
    Column 'Production.Product.Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

    J'ai contourné le problème en créant une VIEW et en appliquant une clause WHERE par la suite sur la colonne 'Nombre de fois que le produit a été vendu'. Reste que je suis sur qu'on puisse faire tout ça à l'intérieur d'une même requête.

  4. #4
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    Ne mettez pas des noms de colonnes à rallonge.
    Si vous avez besoin de présenter vos états avec des noms de colonnes un peu plus parlant, faites le en PHP, pas en MySql.

    Ne mettez pas des espaces dans le nom de vos colonnes.

    N'essayez pas de tout faire dans la requête principale.
    Vous pouvez créer une sous-requête à celle-ci afin de préparer les extractions que vous faites.
    Puis ensuite appliquer à la requête principale les restrictions que vous désirez.
    Code mysql : 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
    SELECT   *
     
        FROM (  SELECT     pp.ProductID,
                           TRIM(CONCAT(pp.[Name], ' ', '(', pp.ProductNumber, ')'))                  as DescProd,
                           pp.Color                                                                  as Couleur,
                           COALESCE(d.Title, 'Pas de documentation disponible')                      as Titre,
                           COUNT(sod.OrderQty) over (partition by pp.ProductID)                      as NbreVendu,
                           FORMAT(AVG(sod.LineTotal) over (partition by pp.ProductID), 'c', 'en-us') as MoyVente
     
                      FROM Production.Product                 as pp
     
                 LEFT JOIN Production.ProductDocument         as ppd
                        ON ppd.ProductID  = pp.ProductID
     
                 LEFT JOIN Production.Document                as d
                        ON d.DocumentNode = ppd.DocumentNode
     
                INNER JOIN      Sales.SalesOrderDetail        as sod
                        ON sod.ProductID  = pp.ProductID
             ) as x
     
    GROUP BY x.ProductID
      HAVING x.NbreVendu > 10
    ORDER BY x.ProductID;
    Ce n'est pas testé.
    A vous de faire vos tests et de corriger les éventuels erreurs.

    Cordialement.
    Artemus24.
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. Filtrer une colonne à partir d'une cellule
    Par D-D-Du-06 dans le forum Excel
    Réponses: 7
    Dernier message: 21/04/2016, 11h26
  2. Filtrer une colonne de recherche de tache selon l'utilisateur actif
    Par neochop dans le forum Développement Sharepoint
    Réponses: 5
    Dernier message: 18/06/2011, 03h33
  3. Somme d'une colonne et d'un COUNT
    Par _ash_ dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/02/2011, 11h06
  4. Réponses: 1
    Dernier message: 22/10/2008, 18h08
  5. trier et filtrer une colonne d'un sur VBA-EXCEL
    Par la_rebelle dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 11/06/2008, 15h50

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