GROUP BY dans la sous-requête T-SQL
Je suis en train de faire un tableau comme ceci:
ProductName | SalesByDate | TotalSalesUntilDate
A | 5 | 15 B | 10 | 30 C | 20 | 25 D | 18 | 43
SalesByDate signifie que le nombre de produits vendus pour chaque produit sur la saisie de la date et de l'TotalSalesUntilDate indique le nombre de produits vendus pour chaque produit à partir de la date du premier jour du mois jusqu'à la date d'entrée (exemple de saisie de date: 17 Mars 2010)
J'ai écrit cette requête à l'aide de sous-requête:
select p.ProductName, A.SalesByDate,
(select(SUM(case when (pd.Date between '01' and @Date)
then s.SalesByDate else 0 end))
from Period pd
inner join Sales s on pd.TimeID = s.TimeID
full join Product p on s.ProductID = p.ProductID) as TotalSalesUntilDate
from Product p join
(select s.ProductID, pd.Date, s.SalesByDate
from Period pd join Sales s on pd.TimeID = s.TimeID) A on
p.ProductID = A.ProductID where @Date = A.Date
mais j'ai obtenu le résultat:
ProductName | SalesByDate | TotalSalesUntilDate
A | 5 | 113 B | 10 | 113 C | 20 | 113 D | 18 | 113
qui le TotalSalesUntilDate indique le nombre de produits vendus dès le premier jour de chaque mois jusqu'à la date d'entrée mais pour tous les produits sans séparation pour chaque produit.
Alors, quand j'ai essayé de changer la requête comme ceci (ajout du GROUPE PAR p.ProductID avant", comme TotalSalesUntilDate"):
select p.ProductName, A.SalesByDate,
(select(SUM(case when (pd.Date between '01' and @Date)
then s.SalesByDate else 0 end))
from Period pd
inner join Sales s on pd.TimeID = s.TimeID
full join Product p on s.ProductID = p.ProductID
group by p.ProductID) as TotalSalesUntilDate
from Product p join
(select s.ProductID, pd.Date, s.SalesByDate
from Period pd join Sales s on pd.TimeID = s.TimeID) A on
p.ProductID = A.ProductID where @Date = A.Date
et lorsque j'exécute cette requête, j'ai ce message d'erreur:
"Msg 512, Niveau 16, État 1, Procédure SalesMTDSubQuery, Ligne 7
La sous-requête a retourné plus de valeur 1. Ce n'est pas permis lorsque l'
sous-requête suit =, !=, <, <= , >, >= ou lorsque la sous-requête est utilisé comme
une expression."
Depuis que je suis nouveau dans SQL et encore à apprendre, mais je ne comprends pas comment résoudre ce problème. Toute aide sera appréciée. Merci.
'01'
dans pd.Date between '01' and @Date
?'01' dans la maladie de parkinson.Date entre " 01 " et @Date pour obtenir la quantité de ventes à partir de la date de 01 jusqu'à la date d'entrée (j'ai mis la date saisie dans la variable @Date), puis de la SOMME, depuis que j'ai de l'état fonction SOMME. Oh, je vais fournir les données brutes de l'époque, mais depuis que les données sont trop, peut-être que je viens de poster une moitié. Il n'est pas un problème, n'est-ce pas?
J'ai édité la question en ajoutant les données brutes, qui est de 3 tables. Si c'est pas assez donc j'ai à offrir, laissez-moi savoir. Merci.
OriginalL'auteur SQLnubie | 2013-11-11
Vous devez vous connecter pour publier un commentaire.
Dans le
@Date
variable nous sommes le stockage de la date:Résultat:
Code complet:
EDIT:
Si vous avez besoin d'utiliser les sous-requête, c'est la façon dont votre exemple de travaux:
C'est une syntaxe alternative pour un CAS - technet.microsoft.com/en-us/library/hh213574.aspx
Ah, je vois.. je vous Remercie pour l'explication sur le IIF.
Génial! Il fonctionne comme prévu! Merci gotqn! 🙂 En passant, u peut expliquer pourquoi je suis mal à mettre la sous-requête dans une instruction SELECT, comme écrit dans ma requête? Et lorsque vous le mettez dans DE l'état, il fonctionne très bien? Je veux savoir où est mon erreur.
Je suppose que votre sous-requête
(select s.ProductID, pd.Date, s.SalesByDate from Period pd join Sales s on pd.TimeID = s.TimeID)
est le retour des enregistrements multiples pour certainsProductID
puis dans la requête principale que vous essayez d'afficher leSalesByDate
mais le serveur ne sais pas qui à afficher. Dans mon cas, je suis en train de faire laSUM
dans la sous-requête et je suis sûr que je vais avoir qu'une seule ligne parProductID
OriginalL'auteur gotqn
Tout d'abord, dans le
Table Period
vous devez avoir les dates, pas'01','02'
de sorte que vous pouvez utiliserBETWEEN
. Ou vous pouvez utiliser1,2,3 ...
mais ils doivent être des nombres.Donc, nous supposons que dans le tableau
Table Period
vous avez des numéros pour les dates (je fais cette remarque, parce que vous utilisez01
, au lieu de1
, qui suppose à la chaîne de valeur. La requête elle-même est relativement facile:Vous prenez des Ventes pour chaque date. Si c'est une date choisie, puis ajouter les ventes à la colonne
SalesByDate
, d'autre ajouter ensuite à la colonneTotalSalesUntilDate
. Vous groupe parProductName
pour calculerSUM
. Et ne sélectionner que les dates qui sont dans la période souhaitée dansWHERE
clause. Nous supposons que cette requête est mise en œuvre que pour un mois donné (parce que nous n'utilisons que de la date de l'élément - c'est à dire 1,2,... pas le mois).Cela permettra d'afficher uniquement les Produits dont les ventes. Si vous voulez voir tous les Produits de la liste, utilisez
LEFT JOIN
au lieu deINNER JOIN
.OriginalL'auteur Bogdan Bogdanov