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

MS SQL Server Discussion :

Distinct et SUM


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Distinct et SUM
    J'ai une table du type

    Pays Commande NumLigne BaseNet
    France 123123 1 1234
    France 123123 2 1234
    France 123124 1 100
    Export 123125 1 12
    Export 123126 2 1000

    Je cherche a faire une somme du champ BaseNet pour toutes les commandes france sachant que le montant BaseNet de chaque ligne est celui de la commande et non celui de la ligne

    Le résultat doit donc être pour france 1334

    Merci pour votre aide

  2. #2
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je ne comprend pas pourquoi vous avez deux lignes avec la même commande dans cette table.
    Une solution pourrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT	Pays
    	, Commande
    	, SUM(BaseNet)
    FROM	dbo.maTable
    WHERE	NumLigne = 1
    GROUP	BY Pays, Commande
    @++

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    la table comporte le N° de commande et toutes les lignes de cette commande, j'ai déjà testé avec un mais j'ai des commandes pour lesquelles je n'ai pas de ligne = 1 mais seulement 2 ou 3
    C'est une table que j'utilise dans Analysis services pour faire des cubes.

    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Dans ce cas comment se fait-il que le montant de la commande ne soit pas porté dans la table des commandes ?
    Celui-ci devrait être mis à jour pour toute modification d'une commande (ajout, suppression, modification d'une ligne de commande)

    Essayez :

    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
    WITH
    	CTE AS
    	(
    		SELECT Commande
    			, MIN(NumLigne) AS min_NumLigne
    		FROM	dbo.maTable
    		GROUP	BY Commande
    	)
    SELECT		Pays
    		, Commande
    		, SUM(BaseNet)
    FROM		dbo.maTable AS T
    INNER JOIN	CTE AS C
    			ON T.Commande = C.commande
    			AND T.NumLigne = C.min_NumLigne
    GROUP	BY	Pays, Commande
    Mais sachez que c'est cochonou ...

    @++

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    J'ai réarangé le code avec mes champs et table mais j'ai un message d'erreur que je n'arrive pas a déboguer

    Serveur*: Msg 156, Niveau 15, État 1, Ligne 1
    Syntaxe incorrecte vers le mot clé 'WITH'.
    Serveur*: Msg 156, Niveau 15, État 1, Ligne 6
    Syntaxe incorrecte vers le mot clé 'ORDER'.

    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
    WITH	CTE AS
    	(
    		SELECT Document, MIN(LigneDocument) AS min_LigneDocument
    		FROM	OLAPT_PORTEFEUILLE_CDE
    		GROUP BY Document
    		ORDER BY Document
    	)
    SELECT		TypePays
    		, Document
    		, SUM(TotalHTNet)
    FROM		OLAPT_PORTEFEUILLE_CDE AS T
    INNER JOIN	CTE AS C
    			ON T.Document = C.Document
    			AND T.LigneDocument = C.min_LigneDocument
    GROUP	BY	TypePays, Document
    si je comprends le principe, c'est de faire une table temporaire avec mes champs mis à jour

  6. #6
    Invité
    Invité(e)
    Par défaut
    Comme le dit le message d'erreur, retirez le ORDER BY de la sous-requête :
    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
    WITH	CTE AS
    	(
    		SELECT Document, MIN(LigneDocument) AS min_LigneDocument
    		FROM	OLAPT_PORTEFEUILLE_CDE
    		GROUP BY Document
    --		ORDER BY Document
    	)
    SELECT		TypePays
    		, Document
    		, SUM(TotalHTNet)
    FROM		OLAPT_PORTEFEUILLE_CDE AS T
    INNER JOIN	CTE AS C
    			ON T.Document = C.Document
    			AND T.LigneDocument = C.min_LigneDocument
    GROUP	BY	TypePays, Document

  7. #7
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Merci mais j'ai toujours un message d'erreur

    Serveur*: Msg 156, Niveau 15, État 1, Ligne 1
    Syntaxe incorrecte vers le mot clé 'WITH'.

    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	CTE AS
    	(
    		SELECT Document, MIN(LigneDocument) AS min_LigneDocument
    		FROM	OLAPT_PORTEFEUILLE_CDE
    		GROUP BY Document
    	)
    SELECT		TypePays
    		, Document
    		, SUM(TotalHTNet)
    FROM		OLAPT_PORTEFEUILLE_CDE AS T
    INNER JOIN	CTE AS C
    			ON T.Document = C.Document
    			AND T.LigneDocument = C.min_LigneDocument
    GROUP	BY	TypePays, Document

  8. #8
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Mettez un point-virgule avant WITH

    @++

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Je m'excuse mais je ne comprends pas le ";"
    j'ai le code suivant

    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	CTE AS
    	(
    		SELECT Document, MIN(LigneDocument) AS min_LigneDocument
    		FROM	OLAPT_PORTEFEUILLE_CDE
    		GROUP BY Document
    	)
    SELECT		TypePays
    		, Document
    		, SUM(TotalHTNet)
    FROM		OLAPT_PORTEFEUILLE_CDE AS T
    INNER JOIN	CTE AS C
    			ON T.Document = C.Document
    			AND T.LigneDocument = C.min_LigneDocument
    GROUP	BY	TypePays, Document
    et il me donne ce message d'erreur
    Serveur*: Msg 170, Niveau 15, État 1, Ligne 1
    Ligne 1 : syntaxe incorrecte vers ';'.

    J'utilise SQL Serveur 2000 SP4

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 896
    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 896
    Points : 53 126
    Points
    53 126
    Billets dans le blog
    6
    Par défaut
    Il n'y a pas de CTE dans SQL Server 2000 qui est d'ailleurs obsolète !

    A +

  11. #11
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    MERCI

    je viens donc d'apprendre les CTE, je me suis débrouillé de faire ma requete sur le serveur sur lequel est installé sql2005 en appelant les tables de la base sql2000

    merci à tous

  12. #12
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Citation Envoyé par maxeln
    Je m'excuse mais je ne comprends pas le ";"
    Normalement depuis SQL Server 2005, toute instruction T-SQL doit se terminer par un point-virgule, ce que bien peu d'entre-nous font à mon avis

    Certaines primitives nécessitent un point-virgule à l'instruction précédente, sauf lorsque celle-ci sont seules dans le lot.
    C'est le cas de WITH lorsque ce mot introduit une expression de table commune comme c'est écrit dans la documentationNotes):

    Lorsqu'une expression de table commune est utilisée dans une instruction faisant partie d'un traitement, l'instruction qui la précède doit être suivie d'un point-virgule.
    Ici vous avez plusieurs instructions dans le lot, et vous n'avez pas mis les point-virgules, au moins à l'instruction précédente.
    Donc pour tricher, je vous ai fait précéder WITH par un point-virgule

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

Discussions similaires

  1. Distinct + sum
    Par Nako_lito dans le forum Débuter
    Réponses: 7
    Dernier message: 03/08/2010, 10h46
  2. requete avec sum if distinct
    Par bourvil dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/05/2010, 14h35
  3. problème avec SUM(Distinct champ_x) sur base access
    Par walid_kerkoub dans le forum Bases de données
    Réponses: 2
    Dernier message: 29/09/2009, 16h14
  4. Utilisation de "sum" et "distinct"
    Par guyanais dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/05/2009, 20h15
  5. SUM de tout les éléments distinct
    Par gomodo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/01/2008, 21h25

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