基于一列的NULL,从一列或另一列中拉取数据的平均值

时间:2015-02-24 16:34:33

标签: sql-server

我已经搜索过一段时间如何做到这一点,但我一周几乎没有使用SQL Dev,所以我可能会遗漏一些明显的东西。

我试图根据两列查询平均值。我可以单独获得每列的平均值,但是我很难进一步。这是表格式:

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;

但是,当非Null时,我还需要使用Override替换相同行的Value。所以基本上我需要一种方法来在Override不是Null时拉取Override而不是Value。

我已经摆弄了CASE声明和其他工具但尚未成功。效率在这一点上并不重要,我只需要让它发挥作用。非常感谢任何帮助!

3 个答案:

答案 0 :(得分: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及更高版本。

答案 1 :(得分:1)

我认为这应该有效:

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

答案 2 :(得分:-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选择Override,如果它不为null,否则它将选择Value。