2015-12-21 51 views
1
SELECT [UnitId], [ParkName] AS Park_Name_Vestas, 
     [TravelHours], 
     [UnitLocation] + ' ' + [SBU] Location_SBU, 
     [TotalEmployees] + 20 "new no_of Employees", 
     MAX(aa.TravelHours) as Maximum 
FROM aa.aa 

这工作得很好,如果我删除max()功能,但max()功能或任何其他功能它提供了以下错误:SQL - 无法使用基本功能

Column 'aa.aa.UnitId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

+3

如果您使用聚合函数(max,sum,count ...),那么您必须添加GROUP BY列。 –

+5

您的代码不是MySQL,所以我将标签更改为“sql”。随意添加您实际使用的数据库(我猜想这是SQL Server)。 –

+0

一般的GROUP BY规则是:如果指定了GROUP BY子句,则SELECT列表中的每个列引用都必须标识分组列或作为set函数的参数。 – jarlh

回答

0

您可以使用GROUP BY id。 id将是您的主键

+4

这是不够的。对于MS SQL Server或Access,SELECT中的所有其他列必须位于GROUP BY中,这似乎是。 –

+0

谢谢。得到它了。 –

+0

非常好的观察迈克尔。谢谢! – Piry

1

您需要将选择列表中的所有列添加到GROUP BY,显然使用group by。你可以先获得分组然后执行一个简单的连接,如

SELECT [UnitId], 
     [ParkName] AS Park_Name_Vestas, 
     [TravelHours], 
     [UnitLocation] + ' ' + [SBU] Location_SBU, 
     [TotalEmployees] + 20 "new no_of Employees", 
     xx.Maximum 
FROM aa 
JOIN (SELECT [UnitId], MAX(aa.TravelHours) as Maximum 
     FROM aa 
     GROUP BY [UnitId]) xx ON aa.[UnitId] = xx.[UnitId]; 
1

窗口函数可以做你想做的事。如果你想所有原始行,那么你可以使用over条款:

SELECT [UnitId], [ParkName] AS Park_Name_Vestas, 
     [TravelHours], [UnitLocation] + ' ' + [SBU] Las ocation_SBU, 
     [TotalEmployees] + 20 "new no_of Employees", 
     MAX(aa.TravelHours) OVER() as Maximum 
FROM aa.aa; 

这给了所有数据的最大值。如果您想要特定组的最大值,请使用PARTITION BY子句。