2016-04-25 88 views
0

我正在學習SQL,我想要提取某些數據。但是,別名在GROUP BY聲明中未被識別。如何在SQL語句的WHERE子句中實現別名

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(我會改變這些習慣)。另外,實踐問題是:

對於每位員工顯示尚未發貨的所有訂單上支付的總價格。

我們在討論Northwind Microsoft數據庫。表的設計是:

enter image description here

即使別名會工作..查詢本身並沒有解決的問題。

+0

http://stackoverflow.com/questions/15900999/how-to-group-by-a-calculated-field –

回答

0

A GROUP BY處理在選擇列表中的表達式。只需在您的GROUP BY中包含E.FirstNameE.LastName,因爲這些是組成您別名的基本列。

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 
3

別名不會在查詢的GROUP BY工作,因爲別名不解決,直到選擇階段,GROUP BY後實際發生的。所以,你會被非混淆表達欲組:

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

接下來,因爲你的分組,你將要彙總值

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

然而,這是不可能的,這是你想要的因爲這些來自Products表。你可能想要的是單價*數量從Order Details表

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 
2

在關於你提到的有關別名列編組問題,請this question

關於您正在嘗試編寫的查詢的問題,您會看到兩個密切相關的錯誤。首先,當您按員工姓名進行分組時,這意味着您需要爲每個不同名稱準確記錄一條記錄。這意味着您不能在SELECT列表中使用像p.UnitPricep.UnitsInStock這樣的字段,因爲不能保證每個員工的字段只有一個值。 SQL Server將報告此問題,並出現如下錯誤。

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將是適當的。但如果你只是嘗試HAVING子句中檢查ShippedDate一個值,你會得到這樣的錯誤:

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條款代替。