Créer une procédure avec SUM()....Group By

Fermé
Romys - 1 oct. 2012 à 12:47
 Romys - 1 oct. 2012 à 16:52
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????
A voir également:

1 réponse

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
1 oct. 2012 à 16:24
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...
1
Youpiiiii! Infiniment merci à toi. Je viens d'essayer le code et il passe correctement.
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.
0