0

我现在正在学习 SQL,我想提取某些数据。但是,GROUP BY声明中不承认别名。

SELECT 
 E.FirstName + ' ' + E.LastName [Full Name],
 P.UnitPrice * P.UnitsInStock [Total Price]
FROM Employees E, Orders O, [Order Details] OD, Products P
WHERE 
 E.EmployeeID = O.EmployeeID
 and O.OrderID = OD.OrderID
 and OD.ProductID = P.ProductID
GROUP BY 
 [Full Name] --this is not recognized
HAVING 
 O.ShippedDate = null

我知道更新的JOIN(我会改变这些习惯)。另外,练习题是:

对于每个员工,显示为他所有尚未发货的订单支付的总价格。

我们正在谈论罗斯文微软数据库。表设计是:

在此处输入图像描述

即使别名会起作用..查询本身并没有解决问题。

4

4 回答 4

3

别名在查询的 GROUP BY 中不起作用,因为直到 SELECT 阶段才解析别名,这实际上发生在 GROUP BY 之后。因此,您需要按未混淆的表达式进行分组:

GROUP BY E.FirstName + ' ' + E.LastName

接下来,由于您正在分组,您将需要聚合值

SUM(P.UnitPrice * P.UnitsInStock) as [Total Price]

但是,这不太可能是您想要的,因为它们来自 Products 表。您可能想要的是订单详细信息表中的 UnitPrice * Quantity 的总和

SUM(OD.UnitPrice * OD.Quantity)

最后,HAVING 子句也是放置聚合的地方。此外,要比较不能使用 = 的 NULL 值,必须使用 IS。如果您只想要未发货的订单,请删除 HAVING 子句并将其放在您的 WHERE 子句中

WHERE 
 E.EmployeeID = O.EmployeeID
 and O.OrderID = OD.OrderID
 and OD.ProductID = P.ProductID
 and O.ShippedDate IS NULL
于 2016-04-25T22:01:26.513 回答
2

关于按别名列分组的问题,请参阅此问题

关于您尝试编写的查询的问题,我看到了两个密切相关的错误。首先,当您按员工姓名分组时,这意味着您希望每个不同的姓名都只有一条记录。这意味着您不能使用列表中的p.UnitPrice和之类的字段,因为无法保证每个员工的这些字段中只有一个值。SQL Server 将报告此问题并显示如下错误。p.UnitsInStockSELECT

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

当您想要选择不在您的GROUP BY子句中的数据时,您需要使用聚合函数,即将应用于单个记录的值集合转换为单个值的函数。在这种情况下,您应该查看该SUM功能。

第二个问题是您正在使用您的条款HAVING应该做的事情。WHERE两者之间的区别在于WHERE,在完成任何分组之前,您的子句中的条件应用于单个记录以确定它们是否将包含在结果集中,而HAVING条件作为一个整体应用于组,并且将通常使用聚合函数。因此,例如,如果您想将结果集限制为总订单值高于某个阈值的员工,那HAVING将是合适的。但是,如果您只是尝试检查子句ShippedDate中的单个值HAVING,您将收到如下错误:

Msg 8121, Level 16, State 1, Line 7
Column 'ShippedDate' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.

请改用该WHERE子句。

于 2016-04-25T22:02:27.607 回答
0

A在选择列表中的表达式之前GROUP BY处理。只需在您的中包含和,因为这些是构成您的别名的基本列。E.FirstNameE.LastNameGROUP BY

于 2016-04-25T21:53:59.460 回答
0

您需要按用于全名的相同表达式进行分组。

此外,您需要更改您的 IS NULL 检查,因为您无法对 null 进行相等检查。

SELECT 
 E.FirstName + ' ' + E.LastName  as [Full Name],
 P.UnitPrice * P.UnitsInStock as [Total Price]
FROM Employees E join  Orders O on  E.EmployeeID = O.EmployeeID
join [Order Details] OD on O.OrderID = OD.OrderID
join Products P on OD.ProductID = P.ProductID 
where o.ShippedDate IS NULL 
GROUP BY 
  E.FirstName + ' ' + E.LastName
于 2016-04-25T21:56:39.753 回答