SQL GROUP BY с повторением идентификатора - (не содержится ни в статистической функции) - PullRequest
0 голосов
/ 22 марта 2012

Я пытаюсь сгруппировать свои результаты по идентификатору здесь, но получаю ошибку: «Столбец« Customers.CompanyName »недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY».

Вот мое утверждение:

DECLARE @dateCompare datetime2 = '2011-01-01 00:00:00.0000000';
DECLARE @dateLow datetime2 = '1992-04-01 00:00:00.0000000'; 
DECLARE @dateHigh datetime2 = '1993-06-01 00:00:00.0000000'; 
SELECT o.OrderID, c.CompanyName, o.ShippedDate, DATEDIFF(year, o.OrderDate, @dateCompare) AS 'ElapsedYear'
FROM Orders o , Customers c
WHERE o.ShippedDate >= @dateLow AND o.ShippedDate <= @dateHigh
GROUP BY o.OrderID 

Какое мое решение здесь? Чего мне не хватает?

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

Если вы не пытаетесь суммировать результаты, вам не нужно выражение group by.

Здесь вы группируете по идентификатору заказа - однако, похоже, что вы вернете одну строку для заказа (в пределах указанных критериев даты) независимо от того, включили ли вы предложение group by.

Итак, удалите предложение group by.

РЕДАКТИРОВАТЬ: Как отмечено в комментарии AndriyM, в настоящее время в запросе нет условия соединения между двумя таблицами, что эффективно создает декартово соединение (т. Е. Где каждая записьв одной таблице связана с каждой записью в другой таблице.) Определенно стоило бы добавить условие соединения к предложению WHERE (или явное объединение двух таблиц вместе).

1 голос
/ 22 марта 2012

Вы можете выбрать только столбцы, которые являются частью вашей группы по выражению, и агрегированные столбцы, такие как MAX (colName), AVG (colName) и т. Д.

1 голос
/ 22 марта 2012

Если есть несколько столбцов, кроме совокупного, вам нужно включить и другие в предложение group by. Немного измените его следующим образом:

SELECT o.OrderID, c.CompanyName, o.ShippedDate, DATEDIFF(year, o.OrderDate, @dateCompare) AS 'ElapsedYear'
FROM Orders o , Customers c
WHERE o.ShippedDate >= @dateLow AND o.ShippedDate <= @dateHigh
GROUP BY o.OrderID, c.companyName, o.ShippedDate
...