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