有子句时出错

时间:2011-07-27 06:59:37

标签: sql sql-server

select SUM (Bill) from ProductSaleReport group by PCI 
having MONTH(Date) between 1 and 3

请问任何人 帮我找到问题。

我收到了错误:

  

Msg 8121,Level 16,State 1,Line 1
  列'ProductSaleReport.Date'在HAVING子句中无效   因为它不包含在聚合函数或   GROUP BY条款。
  Msg 8121,Level 16,State 1,Line 1
  列'ProductSaleReport.Date'在HAVING子句中无效   因为它不包含在聚合函数或   GROUP BY子句。

4 个答案:

答案 0 :(得分:11)

MONTH(日期)不是您按其分组的列,因此它不会出现在having子句中。 你可以这样做:

select SUM (Bill) 
from ProductSaleReport
where MONTH(Date) between 1 and 3
group by PCI 

其他方式是

select SUM (Bill) 
from ProductSaleReport 
group by PCI, MONTH(Date) 
having MONTH(Date) between 1 and 3

但请记住,您将按月和PCI分组结果。

这里解释了WHERE和HAVING之间的区别:Using 'case expression column' in where clause

答案 1 :(得分:7)

使用WHERE在分组前过滤

HAVING用于在发生分组后过滤数据

select SUM (Bill) -- comment: you need to add the PCI column since you use it in the group by right?
from ProductSaleReport 
WHERE MONTH(Date) between 1 and 3
group by PCI 

答案 2 :(得分:2)

MONTH(Date)不是您SELECT编辑的列,因此它不会出现在您的HAVING子句中。

如果您只想从月份在1到3之间的行中SUM Bill,那么这是WHERE子句,而不是HAVING子句

如果每个PCI组中的所有行都具有相同的MONTH(Date),那么您可以将MONTH(Date)添加到SELECT子句中,以便在{HAVING中使用它1}}子句。

答案 3 :(得分:0)

试试这个,

选择 SUM(账单) 来自产品销售报告 按 PCI 分组 有 MIN(MONTH(Date))>=1 和 MAX(MONTH(Date))<=3