我有一张名为Sales
的表,每个促销及其日期都有一个ID
。我还有另一个名为SaleDetail
的广告,其中包含每笔促销的详细信息:Article
和Quantity
已售出。我想显示两个日期之间出售的所有文章和数量的列表。我正在使用:
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子句中“我应该怎么做?谢谢。
答案 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