Sql server SQL中的If、Else或Case语句
我只想在值大于零时取行的平均值。但是,我收到以下错误: “列”“Daily.Rad”“在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY…” 代码:Sql server SQL中的If、Else或Case语句,sql-server,tsql,Sql Server,Tsql,我只想在值大于零时取行的平均值。但是,我收到以下错误: “列”“Daily.Rad”“在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY…” 代码: 如果你试图从平均值中排除负的Rad值,那么我认为你想要的是: SELECT Date, AVG([Speed]) as [Speed], AVG(CASE WHEN [Rad] > 0.0 THEN [Rad] ELSE 0.0 END) AS [Rad], AVG([Pres
如果你试图从平均值中排除负的Rad值,那么我认为你想要的是:
SELECT Date,
AVG([Speed]) as [Speed],
AVG(CASE WHEN [Rad] > 0.0
THEN [Rad]
ELSE 0.0
END) AS [Rad],
AVG([Pressure]) as [Pressure]
FROM Daily
WHERE MONTH(Date) = MONTH('08/31/2011')
GROUP BY Date
您需要将CASE子句放入AVG函数中
SELECT Date,
AVG([Speed]) as [Speed],
AVG (
CASE WHEN [Rad] > 0.0
THEN [Rad]
ELSE 0.0
END) AS [Rad],
AVG([Pressure]) as [Pressure],
Date
FROM Daily
WHERE MONTH(Date) = MONTH('08/31/2011')
GROUP BY Date
其他人给出了正确的答案,如果您想要所有行的平均Rad,忽略负值。相反,如果您只想要正Rad值的平均值,则必须自己计算:
SELECT Date,
AVG([Speed]) as [Speed],
SUM(CASE WHEN Rad>0.0 THEN Rad ELSE 0.0 END)
/SUM(CASE WHEN Rad>0.0 THEN 1 ELSE 0 END) as Rad,
AVG([Pressure]) as [Pressure],
FROM Daily
WHERE MONTH(Date) = MONTH('08/31/2011')
GROUP BY Date
这将消除负值并平均其余值。此外,where子句将导致更好的性能
SELECT Date,
AVG([Speed]) as [Speed],
coalesce(nullif( abs([Rad]), -[Rad]), 0) AS [Rad],
-- OR
coalesce(AVG(CASE WHEN [Rad] > 0 THEN [Rad] END), 0) [Rad]
AVG([Pressure]) as [Pressure],
FROM Daily
WHERE Date >= dateadd(month, datediff(month, 0, '2011-08-31'), 0)
AND Date < dateadd(month, datediff(month, -1, '2011-08-31'), 0)
GROUP BY Date
如您指定的错误消息所示,SQL中的Daily.Data列在哪里?我可以每天看,改为约会。这是一个输入错误吗?该错误与所有非聚合列(即不是聚合函数(如AVG、COUNT等)的一部分的列)都需要位于group by子句中的要求有关。该列每天。Rad您需要使用group by子句指定。如果某个日期的所有值均为0或以下,这不会导致问题吗?@t-clausen.dk-true。如果OP需要处理这种情况,我们可以在表达式周围添加一些保护。这不应该是不必要的,请检查我的答案,以获得更好的解决方法。实际上,我只想在值大于零时去掉平均值。
SELECT Date,
AVG([Speed]) as [Speed],
coalesce(nullif( abs([Rad]), -[Rad]), 0) AS [Rad],
-- OR
coalesce(AVG(CASE WHEN [Rad] > 0 THEN [Rad] END), 0) [Rad]
AVG([Pressure]) as [Pressure],
FROM Daily
WHERE Date >= dateadd(month, datediff(month, 0, '2011-08-31'), 0)
AND Date < dateadd(month, datediff(month, -1, '2011-08-31'), 0)
GROUP BY Date