[英]In SQL How can I get Sums for two sets of date ranges
因此,我將其作為獲取日期范圍內銷售量最高的10種商品的直接方法:
SELECT TOP 10 Sku, Title, SUM(Qty) as SoldQty, COUNT(Qty) as SalesCount
FROM Sales
WHERE SaleDate BETWEEN @StartDate AND @EndDate
GROUP BY Sku, Title
ORDER BY SUM(Qty) DESC
現在,我想要的是另外兩列,分別顯示前30天或上一年等日期的相同日期范圍內的SoldQty和SalesCount等。如果可能,我試圖避免出現循環或多次訪問服務器的情況。
我以為這是某種形式:
SELECT TOP 10 Sku, Title, SUM(Qty) as SoldQty, COUNT(Qty) as SalesCount
FROM Sales
WHERE Sku IN
(
SELECT TOP 10 Sku
FROM Sales
WHERE SaleDate BETWEEN @StartDate AND @EndDate
GROUP BY Sku
ORDER BY SUM(Qty) DESC
)
AND SaleDate BETWEEN @StartDate AND @EndDate
GROUP BY Sku, Title
ORDER BY SUM(Qty) DESC
但是我想不起來如何使用IN子句中創建的那個集合來獲取我需要的其他數據。
我認為可能可行的另一種方式是可以在Sku中這樣引用:
SELECT TOP 10 Sku as TopSku, Title, SUM(Qty) as SoldQty, COUNT(Qty) as SalesCount,
(
SELECT SUM(Qty)
FROM Sales
WHERE Sku = TopSku
AND SaleDate BETWEEN DATEADD(DAY, -30, @StartDate) AND DATEADD(DAY, -30, @EndDate)
) as PrevSoldQty,
(
SELECT Count(Qty)
FROM Sales
WHERE Sku = TopSku
AND SaleDate BETWEEN DATEADD(DAY, -30, @StartDate) AND DATEADD(DAY, -30, @EndDate)
) as PrevSalesCount
FROM Sales
WHERE SaleDate BETWEEN @StartDate AND @EndDate
GROUP BY Sku, Title
ORDER BY SUM(Qty) DESC
朝正確方向的任何一點都將是不錯的。
考慮派生表,其中第一個聚合查詢檢索前10個SKU,第二個聚合查詢與先前日期范圍內的相同SKU匹配:
SELECT s.Sku, s.Title, s.SoldQty, s.SalesCount, p.PrevSoldQty, p.PrevSalesCount
FROM
(
SELECT TOP 10 Sku, Title, SUM(Qty) As SoldQty, COUNT(Qty) As SalesCount
FROM Sales
WHERE SaleDate BETWEEN @StartDate AND @EndDate
GROUP BY Sku, Title
ORDER BY SUM(Qty) DESC
) As s
INNER JOIN
(
SELECT Sku, Title, SUM(Qty) As PrevSoldQty, COUNT(Qty) As PrevSalesCount
FROM Sales
WHERE SaleDate BETWEEN DATEADD(DAY, -30, @StartDate) AND DATEADD(DAY, -30, @EndDate)
GROUP BY Sku, Title
) As p
ON s.Sku = p.Sku AND s.Title = p.Title
或者,您可以使用表別名對相關子查詢略微調整第二個查詢。 但是,由於子查詢是針對每一行運行的,而不是針對所有行的一次調用,因此效率略低
SELECT TOP 10 s.Sku, s.Title, SUM(s.Qty) as SoldQty, COUNT(s.Qty) as SalesCount,
(
SELECT SUM(sub.Qty)
FROM Sales sub
WHERE sub.Sku = s.Sku
AND sub.SaleDate BETWEEN DATEADD(DAY, -30, @StartDate) AND DATEADD(DAY, -30, @EndDate)
) as PrevSoldQty,
(
SELECT Count(sub.Qty)
FROM Sales sub
WHERE sub.Sku = s.Sku
AND sub.SaleDate BETWEEN DATEADD(DAY, -30, @StartDate) AND DATEADD(DAY, -30, @EndDate)
) as PrevSalesCount
FROM Sales s
WHERE s.SaleDate BETWEEN @StartDate AND @EndDate
GROUP BY s.Sku, s.Title
ORDER BY SUM(s.Qty) DESC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.