Как реализовать псевдоним в предложении WHERE оператора SQL

Я сейчас изучаю 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 (я изменю эти привычки). Кроме того, практический вопрос был:

Для каждого сотрудника отобразите общую стоимость, уплаченную за все его заказы, которые еще не были отправлены.

Мы говорим о базе данных Microsoft Northwind. Дизайн таблицы:

введите здесь описание изображения

Даже если бы псевдоним работал... сам запрос не решил вопрос.


person N3wbie    schedule 25.04.2016    source источник
comment
stackoverflow.com/questions/15900999 /   -  person Paul Abbott    schedule 26.04.2016


Ответы (4)


Псевдоним не будет работать в GROUP BY запроса, потому что псевдонимы не разрешаются до фазы SELECT, которая на самом деле происходит после GROUP BY. Итак, вы захотите сгруппировать по выражению без псевдонимов:

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

Далее, поскольку вы группируете, вам нужно агрегировать значения

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

Однако маловероятно, что это то, что вам нужно, поскольку они поступают из таблицы «Продукты». Скорее всего, вам нужна сумма 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
person Bostaevski    schedule 25.04.2016

Что касается вашего вопроса о группировке по столбцам с псевдонимами, см. этот вопрос.

Что касается вашего вопроса о запросе, который вы пытаетесь написать, у вас есть две тесно связанные ошибки, которые я вижу. Во-первых, когда вы группируете по имени сотрудника, это означает, что вам нужна ровно одна запись для каждого отдельного имени. Это означает, что вы не можете использовать такие поля, как p.UnitPrice и p.UnitsInStock, в своем списке SELECT, потому что нет гарантии, что для каждого сотрудника будет ровно одно значение этих полей. 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 будет подходящим. Но если вы просто попытаетесь проверить одно значение 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.

person Joe Farrell    schedule 25.04.2016

GROUP BY обрабатывается ДО выражений в списке выбора. Просто включите E.FirstName и E.LastName в свой GROUP BY, так как это базовые столбцы, составляющие ваш псевдоним.

person Tyler Benzing    schedule 25.04.2016

Вам нужно сгруппировать по тому же выражению, которое вы использовали для своего полного имени.

Кроме того, вам необходимо изменить проверку IS 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
person cableload    schedule 25.04.2016