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 :

Transact SQL - requête


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Par défaut Transact SQL - requête
    Bonjour,

    J'ai plusieurs colonnes A, B, C, D, E
    La colonne A correspond au code produit et la colonne E au chiffre d'affaire.

    Je souhaiterais connaître les produits qui génèrent à eux seuls 30% du chiffre d'affaire.

    En d'autres termes je dois faire le total de la colonne E, la diviser par 3.
    Mais ensuite ne doivent rester que les lignes produits dont le total ne dépasse pas le total de la colonne E divisé par 3.

    Est-ce quelqu'un aurait une solution ?

    J'ai déjà essayé avec la clause HAVING ou des requêtes multiples mais je ne tombe jamais sur le résultat voulu

    Merci pour votre aide

  2. #2
    Membre chevronné Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Par défaut
    Bonsoir,

    Vous pouvez essayer ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT A, SUM(E) FROM T 
    GROUP BY A
    HAVING SUM(E) > (SELECT SUM(E) * 30 / 100 FROM T)
     
    --ou bien avec une cte
    ;WITH CT (A, E) AS 
    (SELECT A, SUM(E) FROM T 
    GROUP BY A) 
    SELECT * FROM CT WHERE E > (SELECT SUM(E) * 30 / 100 FROM CT)
    @+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Par défaut
    Bonsoir,

    merci pour votre réponse.
    En fait j'avais essayé la 1ère solution mais il ne me donne en réponse aucune ligne.
    j'ai essayé la 2ème que vous m'avez soumise mais idem, il ne me donne aucune ligne.
    Si je vais un SELECT sans clauses sur la vue il me donne 11'000 lignes.
    Je pense que le problème vient de la clause HAVING.

    Je cherche encore...

    Merci

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Voyons ce que donnent une de ces deux requêtes :

    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
    WITH
    	CTE_CHIFFRE_AFFAIRE (TiersChiffreAffaire) AS
    	(
    		SELECT SUM(E) * 0.3 AS TiersChiffreAffaire
    		FROM dbo.maTable
    	)
    SELECT A, B, C, D, E
    FROM dbo.maTable AS T
    JOIN CTE_CHIFFRE_AFFAIRE AS C
    	ON T.E >= C.TiersChiffreAffaire
    -------------------------------------------------------
    SELECT A, B, C, D, E
    FROM dbo.maTable AS T
    JOIN (
    		SELECT SUM(E) * 0.3 AS TiersChiffreAffaire
    		FROM dbo.maTable
    	) AS CHIFFRE_AFFAIRE (TiersChiffreAffaire)
    ON T.E >= CHIFFRE_AFFAIRE.TiersChiffreAffaire
    @++

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Par défaut
    Bonsoir,

    merci pour votre réponse.
    Même résultat, dans les 2 cas il ne me donne aucunes lignes.

    vous indiquez en clause
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T.E >= C.TiersChiffreAffaire
    Or avec cette clause il ne me donne aucune ligne si par contre je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T.E <= C.TiersChiffreAffaire
    Là il me donne toutes les lignes à savoir les 11'000 lignes.

    Dans votre cas on demande de faire la somme de E * 30 / 100 et ensuite de sortir chaque ligne ne dépassant pas ce résultat.
    Or c'est normal qu'aucune ligne ne dépasse ce résultat car il est trop grand.

    voici ce que je cherche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Colonne A   Colonne E
      ProdA        100
      ProdB        30
      ProdC        50
      ProdD        20
      ProdE        20
      ProdF        20
      ProdG        20
      ProdH        40
    la somme de la colonne E est 300, pour faire simple si je veux connaitre les produits qui a eux seuls font la moitié du CA soit 150,
    il ne devrait me retourner que les lignes ProdA et prodC qui a eux deux font 150. Soit les 2 produits qui rapportent le plus.

    Merci pour votre aide

  6. #6
    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
    Attention à l'énoncé c'est important.

    Vous voulez connaître les produits qui font au moins 30% du CA
    OU
    les combinaisons de produits qui font au moins 30% du CA.

    Le premier est très simple, le second très très complexe.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/07/2009, 11h33
  2. Transaction sur Requêtes Entities et Requêtes SQL pures
    Par Arnard dans le forum Accès aux données
    Réponses: 1
    Dernier message: 20/04/2009, 14h38
  3. [Requête] SQL SERVER 2000 / Transact SQL
    Par plutonium719 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/09/2007, 18h56
  4. Requête en Transact-SQL : un défi
    Par samworld dans le forum Langage SQL
    Réponses: 5
    Dernier message: 14/08/2007, 22h27
  5. Utilisation d'une fonction Transact-SQL ds une requête SQL
    Par Fl0ppeur dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/02/2006, 14h42

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