select SUM (Bill) from ProductSaleReport group by PCI having MONTH(Date) between 1 and 3 Could any one please help me finding the issue.? I am getting the errors: Msg 8121, Level 16, State 1, Line 1 Column 'ProductSaleReport.Date' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause. Msg 8121, Level 16, State 1, Line 1 Column 'ProductSaleReport.Date' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.
4 Réponses :
Si vous vouliez dire seulement Si toutes les lignes de chaque groupe MOIS (date) code> n'est pas une colonne SELECT code> ed, donc il ne peut pas apparaître dans votre HAVING code> clause. P >
SUM code> Bill code> s de lignes où le mois est compris entre 1 et 3, puis qui est un WHERE code> clause , pas un HAVING code> clause. p>
PCI code> ont le même MOIS (date) code>, vous pouvez ajouter MOIS (date) code> à votre SELECT code> clause afin de l'utiliser dans le PRESENTANT code> clause. p>
Sélectionner n'a rien à voir avec avoir. Seul groupe par matière. Et fonctions agrégées, bien sûr. Le message d'erreur indique la même chose.
Je dois regrouper les données basées sur la valeur PCI. Dans le groupe d'enregistrements PCI, je dois trouver la somme du projet de loi dont la date est le projet de loi sur le mois de janvier, février, mars.
@Andrei Regardez l'exemple dans le manuel SQL Server ... MSDN.MicRosoft. com / fr-US / bibliothèque / ms180199.aspx . La clause ayant code> fonctionne sur le jeu de résultats, il n'a pas vraiment d'importance à la manière dont le jeu de résultats n'a pas été produit, les colonnes qui n'étaient pas dans le groupe de la clause code> peuvent être dans ce Résultat défini et utilisé dans la clause code> code> pour le filtrage.
@Pearl Alors c'est un où code> condition, pas ayant code>. Changer avoir code> à où code> et le déplace avant le groupe par code>.
Il y a une fonction agrégée dans la clause de MSDN.MICROSSOFT.COM/EN-US/ Bibliothèque / MS180199.aspx .
@Andrei Je ne sais pas de quoi vous parlez, il n'y a pas de où code> clauses dans toutes les requêtes sur cette page.
À droite, qui est ce que je l'ai dit. HAVING code> clause est le filtrage sur une colonne qui est dans le jeu de résultats car il était SELECT code> ed. Cette colonne est pas dans la clause GROUP BY code> du tout.
Mois (date) n'est pas une fonction agrégée. Le nombre et la somme sont.
@Andrei: Merci beaucoup. J'ai compris.
Mais quelle est la différence entre filtrer avec avoir et où? Pourquoi devrions-nous placer où Conditon avant le groupe?
S'il vous plaît expliquer ce qui précède. Je suis nouveau à SQL et apprendre. Ce serait une grande aide si quelqu'un me expliquer.
@Pearl acheter un livre. La boîte de commentaires n'est pas l'endroit idéal pour expliquer la manière dont une RDBMS évalue toutes les clauses d'une requête.
@Pearl: histoire courte: Stackoverflow.com/questions/6545664/...
mois (date) n'est pas une colonne que vous avez regroupée. Il ne peut donc pas apparaître dans la clause. Vous pouvez faire comme ça:
select SUM (Bill) from ProductSaleReport group by PCI, MONTH(Date) having MONTH(Date) between 1 and 3
La deuxième version devrait être plus efficace!
@marc_s Ce code d'exemple fonctionne pour moi: Sélectionnez FiscalMonth, Compte (*) de la possibilité d'inéquilibrer où fiscalyear = 2011 Groupe par fiscalmine ayant un fiscalmine entre 1 et 3
@marc_s Vous voyez ceux "ou le groupe par clause" mots. Si vous collaborez par mois (date), vous pouvez l'utiliser pour avoir.
Pearl, les deux @andrei ont écrit fonctionnent, se méfiez-vous que l'utilisation d'avoir des résultats différents de celle de la clause WHERE, car il s'agit également de grouper par mois.
@niktrs Il me semble que des résultats seront les mêmes. Peut-être que j'ai manqué quelque chose. S'il vous plaît donner quelques détails supplémentaires.
@Andrei La première requête renverra le nombre de lignes PCI * mois de mois puisqu'il est regroupé par mois et par pci tandis que la seconde reprendra le numéro de PCI de lignes car il est regroupé par uniquement PCI.
Utiliser où code> filtrer avant le groupe par ayant code> est utilisé pour filtrer les données après le groupe en se produit p>
Essayez ceci, p>
Sélectionnez Somme (facture) de produitsAlleeport Groupe PCI Avoir Min (mois (date))> = 1 et max (mois (date)) <= 3 p>
Eh bien, quelle est l'erreur? Bien que cela ne ressemble pas à vous utilisez des agrégats - vous devriez peut-être utiliser où?
Je mis à jour ma question avec l'erreur. S'il vous plaît passer par là.
Lire pour obtenir une meilleure compréhension des différences entre les endroits et le groupe par base de donnéesJournal.com/features/mysql/article.php/3469351/...