Créer une procédure avec SUM()....Group By
Romys
-
Romys -
Romys -
Bonjour à tous,
Je voudrais créer une procédure en transact sql, mais je n'arrive pas a obtenir ce que je cherche. Je dois sélectionner certains éléments provenant de plusieurs tables, mais en affichant la somme du stock disponible en fonction des références produits, étant donné qu'il y a plusieurs magasins de stockage.
voilà ce que j'ai fais:
SELECT
TOP (100) PERCENT dbo.TB_Produit.IdProd, dbo.TB_Produit.RefProd, dbo.TB_Produit.DesigProd, dbo.TB_Produit.SeuilProd, dbo.TB_Produit.PuVte,
SUM(dbo.TB_Produit_Mag.StockProd), dbo.TB_Fournisseur_Produit.RefProdFour, dbo.TB_Fournisseur_Produit.PuFour, dbo.TB_Fournisseur_Produit.IdFour,
dbo.TB_Produit.Vte
FROM dbo.TB_Produit INNER JOIN
dbo.TB_Fournisseur_Produit ON dbo.TB_Produit.IdProd = dbo.TB_Fournisseur_Produit.IdProd INNER JOIN
dbo.TB_Produit_Mag ON dbo.TB_Produit.IdProd = dbo.TB_Produit_Mag.IdProd
WHERE (dbo.TB_Fournisseur_Produit.IdFour = @IdFour) AND (dbo.TB_Produit.Vte = 1)
GROUP BY dbo.TB_Produit.RefProd
Order by tb_produit.DesigProd
une erreur affiche me disant ceci:
Msg 8120, Niveau 16, État 1, Ligne 2
La colonne 'dbo.TB_Produit.IdProd' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.
Quelqu'un pourrait il m'aider????
Je voudrais créer une procédure en transact sql, mais je n'arrive pas a obtenir ce que je cherche. Je dois sélectionner certains éléments provenant de plusieurs tables, mais en affichant la somme du stock disponible en fonction des références produits, étant donné qu'il y a plusieurs magasins de stockage.
voilà ce que j'ai fais:
SELECT
TOP (100) PERCENT dbo.TB_Produit.IdProd, dbo.TB_Produit.RefProd, dbo.TB_Produit.DesigProd, dbo.TB_Produit.SeuilProd, dbo.TB_Produit.PuVte,
SUM(dbo.TB_Produit_Mag.StockProd), dbo.TB_Fournisseur_Produit.RefProdFour, dbo.TB_Fournisseur_Produit.PuFour, dbo.TB_Fournisseur_Produit.IdFour,
dbo.TB_Produit.Vte
FROM dbo.TB_Produit INNER JOIN
dbo.TB_Fournisseur_Produit ON dbo.TB_Produit.IdProd = dbo.TB_Fournisseur_Produit.IdProd INNER JOIN
dbo.TB_Produit_Mag ON dbo.TB_Produit.IdProd = dbo.TB_Produit_Mag.IdProd
WHERE (dbo.TB_Fournisseur_Produit.IdFour = @IdFour) AND (dbo.TB_Produit.Vte = 1)
GROUP BY dbo.TB_Produit.RefProd
Order by tb_produit.DesigProd
une erreur affiche me disant ceci:
Msg 8120, Niveau 16, État 1, Ligne 2
La colonne 'dbo.TB_Produit.IdProd' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.
Quelqu'un pourrait il m'aider????
A voir également:
- Créer une procédure avec SUM()....Group By
- Comment créer un groupe whatsapp - Guide
- Créer un compte google - Guide
- Créer une adresse hotmail - Guide
- Créer un lien pour partager des photos - Guide
- Créer une liste déroulante excel - Guide
1 réponse
Bonjour,
Contrairement à MySQL, qui est très (trop) permissif à ce sujet, T-SQL impose que tous les champs présents dans le SELECT, hors champs d'agrégation, soient spécifiés dans le GROUP BY.
C'est d'ailleurs ce que t'indique ton message d'erreur.
Donc si je reprends ton SELECT :
dbo.TB_Produit.IdProd -> Doit être rajouté au GROUP BY
dbo.TB_Produit.RefProd -> OK - Déjà dans le GROUP BY
dbo.TB_Produit.DesigProd -> Doit être rajouté au GROUP BY
dbo.TB_Produit.SeuilProd -> Doit être rajouté au GROUP BY
dbo.TB_Produit.PuVte -> Doit être rajouté au GROUP BY
SUM(dbo.TB_Produit_Mag.StockProd) -> OK - fonction d'agrégation
dbo.TB_Fournisseur_Produit.RefProdFour -> Doit être rajouté au GROUP BY
dbo.TB_Fournisseur_Produit.PuFour -> Doit être rajouté au GROUP BY
dbo.TB_Fournisseur_Produit.IdFour -> Doit être rajouté au GROUP BY
dbo.TB_Produit.Vte -> Doit être rajouté au GROUP BY
Ton group by devient donc :
GROUP BY dbo.TB_Produit.IdProd, dbo.TB_Produit.RefProd, dbo.TB_Produit.DesigProd, dbo.TB_Produit.SeuilProd, dbo.TB_Produit.PuVte, dbo.TB_Fournisseur_Produit.RefProdFour, dbo.TB_Fournisseur_Produit.PuFour, dbo.TB_Fournisseur_Produit.IdFour,
dbo.TB_Produit.Vte
Xavier
PS : en utilisant des alias de table et en enlevant les « dbo », tu dois pouvoir alléger l'écriture de ta requête :) Mais c'est juste du cosmétique...
Contrairement à MySQL, qui est très (trop) permissif à ce sujet, T-SQL impose que tous les champs présents dans le SELECT, hors champs d'agrégation, soient spécifiés dans le GROUP BY.
C'est d'ailleurs ce que t'indique ton message d'erreur.
Donc si je reprends ton SELECT :
dbo.TB_Produit.IdProd -> Doit être rajouté au GROUP BY
dbo.TB_Produit.RefProd -> OK - Déjà dans le GROUP BY
dbo.TB_Produit.DesigProd -> Doit être rajouté au GROUP BY
dbo.TB_Produit.SeuilProd -> Doit être rajouté au GROUP BY
dbo.TB_Produit.PuVte -> Doit être rajouté au GROUP BY
SUM(dbo.TB_Produit_Mag.StockProd) -> OK - fonction d'agrégation
dbo.TB_Fournisseur_Produit.RefProdFour -> Doit être rajouté au GROUP BY
dbo.TB_Fournisseur_Produit.PuFour -> Doit être rajouté au GROUP BY
dbo.TB_Fournisseur_Produit.IdFour -> Doit être rajouté au GROUP BY
dbo.TB_Produit.Vte -> Doit être rajouté au GROUP BY
Ton group by devient donc :
GROUP BY dbo.TB_Produit.IdProd, dbo.TB_Produit.RefProd, dbo.TB_Produit.DesigProd, dbo.TB_Produit.SeuilProd, dbo.TB_Produit.PuVte, dbo.TB_Fournisseur_Produit.RefProdFour, dbo.TB_Fournisseur_Produit.PuFour, dbo.TB_Fournisseur_Produit.IdFour,
dbo.TB_Produit.Vte
Xavier
PS : en utilisant des alias de table et en enlevant les « dbo », tu dois pouvoir alléger l'écriture de ta requête :) Mais c'est juste du cosmétique...
Je ne sais quoi te dire. Merci pour m'avoir de m'avoir délivrer de cette PS qui me fatiguait tant.
Que Dieu te garde le plus longtemps possible.