限制已连接和分组的SQL结果

时间:2013-09-04 19:20:19

标签: sql sql-server

我有一张名为Sales的表,每个促销及其日期都有一个ID。我还有另一个名为SaleDetail的广告,其中包含每笔促销的详细信息:ArticleQuantity已售出。我想显示两个日期之间出售的所有文章和数量的列表。我正在使用:

 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'  

但它似乎有逻辑错误,因为我在条款HAVING中的''Sales.Date'无效,因为它不包含在聚合函数或GROUP BY子句中“我应该怎么做?谢谢。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

HAVING子句用于尝试过滤Aggregate时使用。在这种情况下,Sales.Date不会被聚合。所以你可以使用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

答案 2 :(得分:0)

having子句中的变量需要在group by子句中。将Sales.Date表达式改为where子句。

答案 3 :(得分: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