集团通过/集合错误 - SQL

问题描述:

我使用此查询的SQL如下:集团通过/集合错误 - SQL

SELECT p.publisherID, p.publisherName, month(o.orderDate), sum(ol.quantity) 
FROM Orders o, orderLine ol, Publisher p, Book b 
WHERE ol.orderNum = o.orderNum 
And ol.isbn is not null 
And b.isbn=ol.isbn 
And p.publisherID=b.publisherID 
Group By p.publisherID, p.publisherName; 

我得到这个错误:

Msg 8120, Level 16, State 1, Line 1 
Column 'Orders.orderDate' is invalid in the select list because it is not 
contained in either an aggregate function or the GROUP BY clause. 

现在你可以看到,订购日期列实际上是一个函数,但为什么我仍然会得到这个错误?我唯一能想到的是month()函数显示(表达式datetime),当我将鼠标悬停在它上面时,orderDate只是一个“date”数据类型。我不知道如果这是问题。

+2

它是一个函数,但不是一个聚合函数,所以不是返回01/01/2017,而是返回一月份,但是您仍然可以拥有与另一个订单月份相同的发布者。你仍然需要将每个月分组在一起等,只需将月份(订单日期)添加到你的组。如果你不想为每个月和发布商设置一个行,那么你最好从完整的选择中删除它。 – MarkD

+0

月份函数不是一个聚合函数。集合函数的例子是Avg,Count,Max,Min,Sum等等。集合函数在多行上操作。月份功能只能在单行上操作。 –

+0

当你使用group by时,只有聚合函数被允许在不在组中的 – TheGameiswar

由于错误状态,您必须在分组列表中添加Orders.orderDate

+0

这会使错误消失,甚至可能是OP的意图,但我们并不确定。 –

SELECT p.publisherID, p.publisherName, month(o.orderDate), sum(ol.quantity) 
FROM Orders o, orderLine ol, Publisher p, Book b 
WHERE ol.orderNum = o.orderNum 
And ol.isbn is not null 
And b.isbn=ol.isbn 
And p.publisherID=b.publisherID 
Group By p.publisherID, p.publisherName, month(o.orderDate); 

这将返回

+-----+------+-------+-------+ 
| 1 |Bookco|January| 12 | 
| 1 |Bookco|Febuary| 6  | 
| 2 |NextBk|January| 2  | 
+-----+------+-------+-------+ 

没有组由编译器在订单日期不知道如何处理各种个月现身为每个发布的。

如果我正确理解你,你会对简单的标量函数和aggregate function感到困惑。聚合函数接受一组参数(来自多行的字段值)并产生一个结果,而简单的标量函数产生每个参数所需的结果。在你的情况,一组

orderDate  quantity 
01/01/2017  2   
02/01/2017  2 
03/01/2017  2 

SELECT SUM(quantity) FROM table 

会产生只有一个值 - 6虽然

SELECT MONTH(orderDate) FROM table 

会产生价值的三行:

1 
2 
3 

这是简单的标量的区别和聚合函数:聚合函数可以改变结果中的行数,而对于简单函数,函数的输入和输出中将有相同数量的行。 因此,不能像聚合函数那样接收每行的一个结果,因此必须将包含简单函数的字段添加到GROUP BY子句中。

月不是一个聚合函数,则需要通过条款,包括你的团队在此列:

SELECT p.publisherID, p.publisherName, month(o.orderDate), sum(ol.quantity) 
FROM Orders o, orderLine ol, Publisher p, Book b 
WHERE ol.orderNum = o.orderNum 
And ol.isbn is not null 
And b.isbn=ol.isbn 
And p.publisherID=b.publisherID 
Group By p.publisherID, p.publisherName, month(o.orderDate); 

一些规则GROUP BY子句的:允许

  1. 唯一项目具有group by子句的查询的选择列表是

    • GROUP BY中的表达式
    • 聚合函数(SUM,COUNT,MAX,MIN,AVG)
  2. 表达式GROUP BY子句中不一定要包含在SELECT语句

正如已经被别人解释的,月是不是一个聚合函数,但是一个标量函数。