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 :

Tables pour lesquelles le chiffre d’affaires réalisé est le plus élevé


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    informatique
    Inscrit en
    Avril 2013
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 280
    Billets dans le blog
    1
    Par défaut Tables pour lesquelles le chiffre d’affaires réalisé est le plus élevé
    bonjour,j'ai du mal à ecrire la requete que voici: Tables pour lesquelles le chiffre d’affaires réalisé est le plus élevé.
    voici la structure des tables pour ecrire la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    
    FACTURE(numfacture,#numtable,#numserveur,datefacture);
    CONSOMMATION(numcons,libcons,prixcons)
    
    COMPREND(#numfacure,#numcons,qte)
    TABL(numtable,nomtable,nbplace)
    jai donc ecrire une requete que voici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select sum(qte*prixcons) as 'CA' ,f.numtable 
    from comprend com,consommation c,facture f
    where com.NUMCONS=c.NUMCONS
    and f.NUMFACTURE=com.NUMFACTURE
    group by f.numtable
    et j'obtiens cette reponse que voici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CA      numtable
    
    80.50       1
    61.50  	    3
    66.90  	    4
    198.00	    5
    36.50 	    7
    je constate que la table numero 5 à le plus grand CA(198.00).Mais comment faire pour que la requete le me donne directement.j'ai voulu faire un max(sum(qte*prixcons)),mais impossible car l'editeur me marque une erreur de syntaxe.merci 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
    Que d'horreurs dans cette requête...
    1) les jointures se font avec JOIN et ON depuis 1992 ! Recyvclez vous.. lisez mon livre sur SQL !!!
    2) les apostrophes sont inutile pour un alias de colonne (CA)

    Voici une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH T AS 
    (
    select sum(qte*prixcons) as CA, f.numtable,
           RANK() OVER(ORDER BY sum(qte*prixcons) DESC) AS N
    from   comprend com 
           INNER JOIN onsommation c
                 ON com.NUMCONS=c.NUMCONS
           INNER JOIN facture f
                 ON f.NUMFACTURE=com.NUMFACTURE
    group  by f.numtable
    )
    SELECT CA, numtable
    FROM   T
    WHERE  N = 1;
    Et pour apprendre les fonction de fenêtrage, mon site web comme mon bouquin : http://sqlpro.developpez.com/article...clause-window/

    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 chevronné
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    Bonjour,

    Voici une autre solution possible :

    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
    CREATE TABLE #T (ID int,ca int ,qte int,)
     
    INSERT INTO #T VALUES (1,12,2)
    INSERT INTO #T VALUES(2,20,3)
    INSERT INTO #T VALUES (3,30,3)
    INSERT INTO #T VALUES (3,450,10)
     
    SELECT *
    FROM #T
     
     
    SELECT MAX (C.CA)
    FROM 
    (SELECT sum(ca*qte) as 'CA'
    FROM #T
    GROUP BY ID
     ) as C
    Cette solution a le mérite de vous aider a comprendre la cinématique, mais honnetement je préfère la solution de SQL Pro qui est bien plus performante et perenne.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/06/2014, 10h51
  2. Réponses: 29
    Dernier message: 11/10/2011, 14h28
  3. Réponses: 3
    Dernier message: 02/06/2010, 07h48
  4. Réponses: 0
    Dernier message: 08/09/2009, 18h34
  5. Réponses: 4
    Dernier message: 22/05/2006, 10h25

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