2015-02-24 38 views
0

我已經搜索了一段時間瞭解如何執行此操作,但我幾乎沒有在一週內使用SQL Dev,所以我可能會丟失一些明顯的東西。從一列或另一列中提取數據的平均值,基於一列的NULL

我想查詢基於兩列的平均值。我可以單獨獲得每列的平均值,但是我有進一步的麻煩。這裏的表格格式:

Value Override ID Hourend 
19  (Null) 1 6:00 
23  (Null) 1 4:00 
45  18  1 6:00 
66  (Null) 2 6:00 
68  (Null) 2 5:00 
72  (Null) 1 5:00 
81  45  1 5:00 

我想要的是每小時價值列的平均值,按ID。我已經使用了:

SELECT AVG (Value) 
    (OVER (PARTITION BY ID, Hourend) as Average 
FROM Database.Table; 

但是,我還需要有一個平均值,當不是空值時,用同一行的替代值代替。所以基本上我需要一種方法來拉動覆蓋而不是價值時,覆蓋不是空。

我已經擺弄CASE語句和其他工具,但迄今尚未成功。效率在這一點上並不重要,我只需要讓它工作。任何幫助是極大的讚賞!

+0

怎麼樣的情況下'CASE時覆蓋IS NOT NULL然後覆蓋ELSE值END' – JonH 2015-02-24 16:38:13

回答

-1
CREATE TABLE #Temp (Value int, Override int , ID int, Hourend varchar(10)) 


INSERT INTO #Temp VALUES (19,Null,1,'6:00') 
INSERT INTO #Temp VALUES(23,Null,1,'4:00') 
INSERT INTO #Temp VALUES(45,18 ,1,'6:00') 
INSERT INTO #Temp VALUES(66,Null,2,'6:00') 
INSERT INTO #Temp VALUES (68,Null,2,'5:00') 
INSERT INTO #Temp VALUES(72,Null,1,'5:00') 
INSERT INTO #Temp VALUES(81,45 ,1,'5:00') 

SELECT ID,Hourend ,AVG(COALESCE(CAST(Override as decimal) ,CAST(VAlue as decimal))) 
FROM #Temp 
GROUP BY ID,Hourend 

這應該做竅門,COALESCE選擇覆蓋,如果它不爲空,否則它會選擇值。

+0

發生了什麼事在這裏的價值?您需要根據OP的要求提出結論。 – JonH 2015-02-24 16:38:45

+0

@JonH我已經更新了我的答案,我錯過了那部分。謝謝。 – CiucaS 2015-02-24 16:47:59

+0

我對使用表格猶豫不決,主要是因爲我是SQL Dev的新手,對創建表格數據的存儲空間毫無頭緒。如果它在數據庫中,我不允許這樣做,因爲永遠不允許(手動)編輯數據庫。 – jcfranks87 2015-02-24 18:25:30

1

你可以做到這一點與內嵌IIF

SELECT AVG (IIF(Override IS NOT NULL, Override, Value)) 
    OVER (PARTITION BY ID, Hourend) as Average 
FROM Database.Table; 

IIF是可用於SQL Server 2012及以上。

+0

我得到一個「錯誤的右括號」之間的覆蓋和IS NOT NULL錯誤,但我不知道可能導致它。 >< – jcfranks87 2015-02-24 18:20:16

+0

事實證明'Override'是SQL Server中的一個關鍵字。您需要將其包含在內部方括號中:'IIF([Override] IS NOT NULL ...' – 2015-02-24 18:22:22

+0

Override不是列的實際名稱;實際名稱是OVERRIDE_XXX_XXX,Value列是XXX_XXX(其中X是標識字母)。這是否仍然會導致問題? – jcfranks87 2015-02-24 18:33:04

1

我認爲這應該工作:

SELECT AVG (CASE WHEN Override IS NOT NULL THEN Override ELSE Value END) 
OVER (PARTITION BY ID, Hourend) as Average 
FROM Database.Table; 
+0

當以這種方式嘗試時,我得到一個錯誤,即WHEN之後的覆蓋是無效的標識符。這很奇怪,因爲我可以去:選擇從數據庫。表覆蓋,它拉動它就好了。 – jcfranks87 2015-02-24 18:21:29

+0

你有一個額外的'('在你發佈的原始代碼,我警察y /粘貼你的:P – Kritner 2015-02-24 18:58:07

相關問題