平均没有平均功能

时间:2015-02-17 08:40:34

标签: sql sql-server average

我需要计算6列的平均值,但是当有空字段时我不想计算它。

例如,如果我有(2,3,2,3,2,3)我应该得到15/6 = 2,5但是当它是(2,3,2,3,'空','空')我需要10/4 = 2,5。

如何实现这一目标?

这是6列的平均值,我不能使用avg函数,它默认忽略NULL。

5 个答案:

答案 0 :(得分:1)

您可以使用"空"创建一个跳过行的视图或子查询。值并在视图或子查询上取平均值。

SELECT AVG(value) FROM 
    (SELECT value FROM table WHERE value <> the_value_that_janek_considers_as_empty)

但我会认真地建议你重新考虑你的空洞&#34;的概念。数据库中没有空数字值。要么你说&#34;空&#34;实际上你的意思是&#34; null&#34;,或者你正在做一些可怕的事情,比如在文本栏中存储数字。

答案 1 :(得分:1)

使用NULL语句捕获CASE值。见下文:

SELECT
     AVG(ISNULL(Column_to_Average,0)[Column_to_Average])
FROM #yourtable

OR

SELECT
     AVG(CASE WHEN Column_to_Average IS NULL OR Column_to_Average=''
              THEN 0 ELSE Column_to_Average END)
FROM #yourtable

如果您想获得每行的平均值,也可以这样做。

SELECT
     (
     (CASE WHEN Column_to_Average_1 IS NULL OR Column_to_Average_1='' THEN 0 ELSE Column_to_Average_1 END) +
     (CASE WHEN Column_to_Average_2 IS NULL OR Column_to_Average_2='' THEN 0 ELSE Column_to_Average_2 END) +
     (CASE WHEN Column_to_Average_3 IS NULL OR Column_to_Average_3='' THEN 0 ELSE Column_to_Average_3 END) +
     (CASE WHEN Column_to_Average_4 IS NULL OR Column_to_Average_4='' THEN 0 ELSE Column_to_Average_4 END) +
     (CASE WHEN Column_to_Average_5 IS NULL OR Column_to_Average_5='' THEN 0 ELSE Column_to_Average_5 END) +
     (CASE WHEN Column_to_Average_6 IS NULL OR Column_to_Average_6='' THEN 0 ELSE Column_to_Average_6 END)
     )/6 Column_to_Average
FROM #YourTable

答案 2 :(得分:1)

忽略空值很简单,sqlserver已经忽略了空值:

SELECT avg(x) 
FROM (values(4),(6),(null)) x(x)

结果

5

编辑,因为你的评论说你的数字列是一个varchar - 这是愚蠢的,这样做是为了处理空值和空值:

SELECT 
  avg(cast(nullif(x, '') as decimal(18,2))) 
FROM (values('4'),('6'),(null), ('')) x(x)

答案 3 :(得分:0)

select sun(x)  --sql server ignore null,
       count(x)  --sql server ignore null,
       sum(x)/count(x) as avgx
from tbl

答案 4 :(得分:0)

你面临两个问题:

  1. 您必须将字符串转换为数字,并避免使用空字符串和空字符串。

  2. 您需要计算列的平均值,因此只要数据采用该格式,avg函数就无法使用。

  3. 基本上有两种可能的方法,您可以使用列值,也可以将列转换为行。

    使用列值自然会变得重复。您必须转换每个列,并检查有多少可用列:

    select
      (
        case when Col1 is null or Col1 = '' then 0.0 else cast(Col1 as float) end +
        case when Col2 is null or Col2 = '' then 0.0 else cast(Col2 as float) end +
        case when Col3 is null or Col3 = '' then 0.0 else cast(Col3 as float) end +
        case when Col4 is null or Col4 = '' then 0.0 else cast(Col4 as float) end +
        case when Col5 is null or Col5 = '' then 0.0 else cast(Col5 as float) end +
        case when Col6 is null or Col6 = '' then 0.0 else cast(Col6 as float) end
      ) / (
        case when Col1 is null or Col1 = '' then 0.0 else 1.0 end +
        case when Col2 is null or Col2 = '' then 0.0 else 1.0 end +
        case when Col3 is null or Col3 = '' then 0.0 else 1.0 end +
        case when Col4 is null or Col4 = '' then 0.0 else 1.0 end +
        case when Col5 is null or Col5 = '' then 0.0 else 1.0 end +
        case when Col6 is null or Col6 = '' then 0.0 else 1.0 end
      ) as Average
    from
      TheTable
    

    您可以创建用户定义的函数来执行转换和计数,但您仍需要为每列执行此操作。

    (还要注意;如果任何一列中没有值,这将给你一个零除错误。)

    您可以使用unpivot将列转换为行,但是您需要一个唯一值来对结果进行分组,以使各个行保持在一起。例如:

    select
      Id, avg(cast(Col as float))
    from
      TheTable
    unpivot
      (Col for ColName in (Col1, Col2, Col3, Col4, Col5, Col6)) x
    where
      Col <> '' and Col is not null
    group by
      Id