一般的な(私が推測する?)タイプのクエリ:
2 つのテーブル ('products'、'productsales') があります。「productsales」の各レコードは販売を表します (したがって、「date」、「quantity」、「product_id」があります)。次のようなクエリを効率的に作成するにはどうすればよいですか。
日付 Y から日付 Z の間に X 回以上販売されたすべての製品の製品名を取得します。
(Xは取引数ではなく販売数量です)
一般的な(私が推測する?)タイプのクエリ:
2 つのテーブル ('products'、'productsales') があります。「productsales」の各レコードは販売を表します (したがって、「date」、「quantity」、「product_id」があります)。次のようなクエリを効率的に作成するにはどうすればよいですか。
日付 Y から日付 Z の間に X 回以上販売されたすべての製品の製品名を取得します。
(Xは取引数ではなく販売数量です)
SELECT p.[name]
FROM products p
WHERE p.product_id in (SELECT s.product_id
FROM productsales s
WHERE s.[date] between @dateStart and @dateEnd
GROUP BY s.product_id
HAVING Sum(s.quantity) > @X )
上記のクエリは完全には正しくありません...
SELECT Name FROM Products
WHERE ProductId IN
( SELECT ProductId
FROM ProductSales
WHERE ProductSales.Date BETWEEN Y AND Z
GROUP BY ProductId
HAVING SUM(ProductSales.Qty) > x
)
実際には、 group by statementを学ぶべきだと思います。
最も単純なステートメントは次のようになります。
SELECT ps.product_id, COUNT(*)
FROM product_sales ps
WHERE ps.product_id = id AND ps.Date BETWEEN @Y AND @Z
GROUP_BY product_id;
SELECT p.[name]
FROM
products p
INNER JOIN
productsales ps
ON
p.id = ps.product_id
WHERE
ps.date BETWEEN @Y AND @Z
GROUP BY
p.[name]
--,p.id if it is likely that you have two products with the same name
HAVING
SUM(ps.quantity) > @X
以下を使用して、MS AdventureWorks DBで正常にテストされました。
DECLARE @Y DATETIME, @Z DATETIME, @X INT
SET @Y = '2004-06-09'
SET @Z = '2004-08-01'
SET @X = 100
SELECT p.[Name]
FROM
Production.Product p
INNER JOIN
Sales.SalesOrderDetail ps
ON
p.ProductID = ps.ProductID
WHERE
ps.ModifiedDate BETWEEN @Y AND @Z
GROUP BY p.Name
HAVING
SUM(ps.OrderQty) > @X