簡體   English   中英

在SQL中如何獲取兩組日期范圍的求和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM