2015-02-24 39 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

相关问题