我已经搜索过一段时间如何做到这一点,但我一周几乎没有使用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声明和其他工具但尚未成功。效率在这一点上并不重要,我只需要让它发挥作用。非常感谢任何帮助!
答案 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。