2013-09-04 2 views
0

У меня есть таблица под названием Sales, у которой есть ID для каждой продажи и ее дата. У меня есть еще один, который называется SaleDetail, который содержит информацию о каждой продаже: Article и Quantity продано. Я хочу показать список всех статей и их количества, которые были проданы между двумя датами. Я использую:Restrict Объединенные и сгруппированные результаты SQL

SELECT 
SaleDetail.Article, 
SUM(SaleDetail.Quantity) AS Pieces 
FROM 
SaleDetail 
JOIN Sales ON Sales.ID = SaleDetail.ID 
GROUP BY SaleDetail.Article 
HAVING Sales.Date BETWEEN '10-01-2013' AND '20-01-2013' 

Но, кажется, есть логические ошибки, потому что я получаю «„Sales.Date“в пункте HAVING не действует, так как он не содержится в статистической функции или в GROUP BY статья «Как мне это сделать? Спасибо.

+0

'ON Sales.ID = SaleDetail.ID' выглядит неправильно. Вы уверены, что таблицы должны быть объединены в эти столбцы? –

ответ

2

Здесь предполагается, что условие должно находиться в условии where, но не имеет оговорки. Имея только группы в целом, тогда как предложение WHERE применяется к отдельным строкам. Здесь вы ищете строки с конкретными датами.

SELECT 
SaleDetail.Article, 
SUM(SaleDetail.Quantity) AS Pieces 
FROM 
SaleDetail 
JOIN Sales ON Sales.ID = SaleDetail.ID 
where Sales.Date BETWEEN '10-01-2013' AND '20-01-2013' 
GROUP BY SaleDetail.Article 
+0

Гоша, спасибо –

+0

@Sonam существует ограничение по времени, на которое оп не может отметить ответ как принятый. Это ограничение существует специально для того, чтобы дать время для получения дополнительных ответов, поэтому, пожалуйста, не просите пользователя пометить ваш ответ как принятый через 6 минут после того, как вы разместили его. – Lamak

+0

Спасибо Ламаку, я не знал об этом. Я только прошу отметить это, потому что много раз пользователи забывают или не знают. – Sonam

1

Предложение HAVING предназначено для использования при попытке фильтровать на агрегате. В этом случае Sales.Date не агрегируется. Поэтому вы можете просто использовать ГДЕ.

SELECT 
SaleDetail.Article, 
SUM(SaleDetail.Quantity) AS Pieces 
FROM 
SaleDetail 
JOIN Sales ON Sales.ID = SaleDetail.ID 
WHERE Sales.Date BETWEEN '10-01-2013' AND '20-01-2013' 
GROUP BY SaleDetail.Article 
0

переменные в предложении having должен быть в предложении group by. Вместо этого поместите выражение Sales.Date в предложение where.

+0

Но где переменная в разделе «Предложение»? – Sonam

+0

См. Другие ответы, обратите внимание, что нет 'наличия'. 'have' не требуется только потому, что есть' group by'. Подумайте: 'have'' '' '' '' '' '' '' '. И, не группируясь в столбце даты, чтобы мы могли использовать его вместо «где». – radarbob

0
declare @SaleDetail table (ID int, Article varchar(40), Quantity int ) 
declare @Sales table (ID int, Quantity int , [Date] Date) 

SELECT 
SaleDetail.Article, 
SUM(SaleDetail.Quantity) AS Pieces 
FROM 
@SaleDetail SaleDetail 
JOIN @Sales Sales ON Sales.ID = SaleDetail.ID 
WHERE Sales.Date BETWEEN '2013-01-10' AND '2013-01-20' 
GROUP BY SaleDetail.Article 
Смежные вопросы