9
votes

Erreur avec la clause

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.

3 commentaires

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/...


4 Réponses :


2
votes

MOIS (date) n'est pas une colonne SELECT ed, donc il ne peut pas apparaître dans votre HAVING clause.

Si vous vouliez dire seulement SUM Bill s de lignes où le mois est compris entre 1 et 3, puis qui est un WHERE clause , pas un HAVING clause.

Si toutes les lignes de chaque groupe PCI ont le même MOIS (date) , vous pouvez ajouter MOIS (date) à votre SELECT clause afin de l'utiliser dans le PRESENTANT clause.


13 commentaires

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 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 peuvent être dans ce Résultat défini et utilisé dans la clause pour le filtrage.


@Pearl Alors c'est un condition, pas ayant . Changer avoir à et le déplace avant le groupe par .


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 clauses dans toutes les requêtes sur cette page.


À droite, qui est ce que je l'ai dit. HAVING clause est le filtrage sur une colonne qui est dans le jeu de résultats car il était SELECT ed. Cette colonne est pas dans la clause GROUP BY 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/...



15
votes

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


6 commentaires

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.



8
votes

Utiliser filtrer avant le groupe par

ayant est utilisé pour filtrer les données après le groupe en se produit xxx


0 commentaires

0
votes

Essayez ceci,

Sélectionnez Somme (facture) de produitsAlleeport Groupe PCI Avoir Min (mois (date))> = 1 et max (mois (date)) <= 3


0 commentaires