2009-12-30 24 views
0

我有一個數據庫表結構如下 -SQL識別出公差值

Week_End  Sales 
2009-11-01 43223.43 
2009-11-08  4324.23 
2009-11-15 64343.23 
... 

我要的是,將採取一個開始和結束日期,並在該期間內找出所有行的SQL語句銷售數字高於或低於該期間平均銷售數字3%以上。所以,對上述數據運行,它會返回 -

Week_End  Sales 
2009-11-08  4324.23 

我使用SQL Server 2008,順便說一句。

+0

你的結果會返回所有3個值。上限爲38415.87,下限爲36178.05。 – 2009-12-30 23:18:57

+0

是的 - 我的錯誤 – 2009-12-30 23:26:07

回答

4

注:在您的例子,平均是37297,因此表中的所有三個值最終被公差之外。

;with Weeks as --narrows the range to the provided dates 
(
    select * from YourTable 
    where Week_End between @StartDate and @EndDate 
), 
PercentOff as 
(
    select week_end, sales, abs((a.avg - sales)/a.avg) as pct 
    from Weeks 
    cross join (select avg(sales) as avg from Weeks) a 
) 
select * from PercentOff where pct >= .03 
+0

你還沒有完全解決這個問題。他想把平均數縮小到一個特定的時間段,而不是整個表。 – 2009-12-30 23:09:43

+0

哎呀,我已經更新了,所以CTE需要@ StartDate/@ EndDate – dan 2009-12-30 23:10:51

+0

感謝丹 - 平均分。這不是真實的生活數據,只是我輸入的一些垃圾。你的解決方案非常優雅,完美適合我的需求。 – 2009-12-30 23:25:24

2

像這樣的事情應該工作,你的日期或參數更換必要

SELECT [Week_End] 
     ,[Sales] 
    FROM [MyTable] 
    WHERE [Week_End] BETWEEN '2009-12-01' AND '2009-12-31' AND 
    Notional NOT BETWEEN 
    .97 * 
     (SELECT AVG(Sales) 
     FROM [MyTable] 
     WHERE [Week_End] BETWEEN '2009-12-01' AND '2009-12-31') 
    AND 
    1.03 *(SELECT AVG(Sales) 
     FROM [MyTable] 
     WHERE [Week_End] BETWEEN '2009-12-01' AND '2009-12-31') 
+0

這裏有個很好的例子,特別是在他使用SQL Server 2008的時候。 – 2009-12-30 23:03:54

+0

同意,你可以寫一個CTE來計算兩個公差,然後交叉連接。讓我看看我能否得到這個工作。 – dsolimano 2009-12-30 23:09:12

+0

作爲CTE,我正在考慮'SELECT * FROM [MyTable] WHERE [Week_End]'2009-12-01'和'2009-12-31')''。 – 2009-12-30 23:11:59

1

我認爲你可以做到這一點,而不需要使用分析函數進行自連接。儘管如此,我還沒有SQL Server 2008來測試它。試試這個:

SELECT * 
FROM (SELECT [Week_End] 
      , [Sales] 
      , AVG([Sales]) OVER() AS [Avg_Sales] 
     FROM [MyTable] 
     WHERE [Week_End] BETWEEN '2009-12-01' AND '2009-12-31') AS s 
WHERE ABS(([Sales] - [Avg_Sales])/[Avg_Sales]) >= 0.03