2017-03-05 37 views
1

所以我有這個作爲一個直接的方式來獲得一個日期範圍內前10名的銷售項目:在SQL我怎樣才能獲得資金用於兩套日期範圍

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 

現在我想要的是二更多專欄顯示SoldQty和SalesCount相同的日期範圍前30天或前一年等我試圖避免循環或多次旅行服務器,如果可能的話。

我想這將是某種形式的這樣:

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 

在正確的方向上的任何一點就好了。

回答

2

考慮派生表,其中第一聚合查詢檢索頂部10的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