Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL中的If、Else或Case语句_Sql Server_Tsql - Fatal编程技术网

Sql server SQL中的If、Else或Case语句

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

我只想在值大于零时取行的平均值。但是,我收到以下错误:

“列”“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([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