分组/聚合错误 - SQL

时间:2017-02-15 15:53:28

标签: sql sql-server function aggregate

我用于此查询的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.

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

5 个答案:

答案 0 :(得分:1)

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     |
+-----+------+-------+-------+

如果没有编组中的订单日期,则不知道如何处理每个发布者的各种月份。

答案 1 :(得分:0)

如错误所述,您必须在分组依据列表中添加Orders.orderDate

答案 2 :(得分:0)

如果我理解正确,你会对简单的标量函数和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子句中。

答案 3 :(得分:0)

月份不是聚合函数,您需要在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);

答案 4 :(得分:0)

Group BY子句的一些规则:

  1. 只有具有group by子句的查询选择列表中允许的项目为

    • Group BY中的表达
    • 聚合函数(SUM,COUNT,MAX,Min,AVG)
  2. group by子句中的表达式不必包含在select语句
  3. 正如其他人已经解释过的那样,Month不是一个聚合函数,而是一个标量函数。