为什么此查询仅在我使用group by时才有效?

时间:2010-11-24 12:32:41

标签: sql-server tsql

此查询有效:

select p.Nombre as Nombre, c.Nombre as Categoria, s.Nombre as Subcategoria FROM Producto as p
inner join Subcategoria as s ON p.IDSubcategoria = s.ID
inner join Categoria as c on s.IDCategoria = c.ID
group by p.Nombre, c.Nombre, s.Nombre
order by p.Nombre

但是当我在group by语句中删除s.Nombre时,我收到了这个错误:

  

Msg 8120,Level 16,State 1,Line 1   列'Subcategoria.Nombre'是   因为它在选择列表中无效   不包含在任何一个   聚合函数或GROUP BY   子句。

有人可以向我解释一下按功能分组的内容以及为什么它允许查询工作吗?

为了学习的兴趣!感谢。

4 个答案:

答案 0 :(得分:3)

当您按p.Nombre说明分组时,您指定每个不同的p.Nombre应该只有一行输出。因此,必须聚合select子句中的其他字段(因此,如果有多个行具有相同的p.Nombre,则可以将它们“折叠”为一个值)

通过对p.Nombre, c.Nombre, s.Nombre进行分组,您说每个不同的元组应该只有一行输出。因此,它起作用(因为显示的字段涉及分组子句)。

答案 1 :(得分:0)

如果使用GROUP BY子句,则可以使用SELECT字段:

  • 您已逐段使用的字段
  • 在其他字段上聚集(min,max,count ....)

一个小例子:

 MyTable
 FieldA  FieldB
    a      1
    a      2
    b      3
    b      5

查询:

select a, b from myTable GroupBy a

A   B
a   ?
b   ?

您希望在字段B中包含哪些值?

A-> 1或a - > 2或a - > 3(1 + 2)

如果第一个你需要min(a)聚合函数。如果你需要2 - 最大如果3 - sum()。

答案 2 :(得分:0)

group by函数将GROUP BY子句中指定的列中具有相同值的行折叠为一行。对于SELECT中未在GROUP BY子句中指定的任何其他列,SQL引擎也需要通过聚合函数知道如何处理这些列,例如, SUM,MAX,AVG等。如果未指定聚合函数,则引擎会抛出异常,因为它不知道该怎么做。

E.g。

select p.Nombre as Nombre, c.Nombre as Categoria, SUM(s.Nombre) as Subcategoria FROM Producto as p 
inner join Subcategoria as s ON p.IDSubcategoria = s.ID 
inner join Categoria as c on s.IDCategoria = c.ID 
group by p.Nombre, c.Nombre
order by p.Nombre 

答案 3 :(得分:0)

只有在使用COUNT或MAX等聚合函数时才需要group-by子句。作为副作用,它会删除重复的行。在您的情况下,通过将DISTINCT添加到select子句并删除group-by子句来删除重复项更为简单。

select DISTINCT p.Nombre as Nombre, c.Nombre as Categoria, s.Nombre as Subcategoria FROM Producto as p
inner join Subcategoria as s ON p.IDSubcategoria = s.ID
inner join Categoria as c on s.IDCategoria = c.ID
order by p.Nombre