平均行[SQL]

时间:2014-08-18 08:46:02

标签: sql row average

实际上我对我应该在这个主题上写的内容感到有点困惑。

关键是这样,我想平均Speed01,Speed02,Speed03Speed04

SELECT
   Table01.Test_No,
   Table01.Speed01,
   Table01.Speed02,
   Table01.Speed03,
   Table01.Speed04,

我想创建一个包含此平均值的新列 - >>

AVG(Table01.Speed01, Table01.Speed02, Table01.Speed03,Table01.Speed04) as "Average" 

我试过这个,但它没有用。

From
   Table01

因此,Speed列的包含可能存在,但有时Speed02没有数字,但其他人有数字。有时speed04数据也会丢失而其他数据存在,有时只有一个数据(例如:只有Speed01)有数据。让我们说它取决于传感器捕捉测试材料速度的能力。

如果您能找到解决方案,那将是一个很大的帮助。我是新手。 谢谢你^^

3 个答案:

答案 0 :(得分:1)

AVG是一个SQL聚合函数,因此不适用。所以干脆算一算。平均值除以计数:

(SPEED01 + SPEED02 + SPEED03 +SPEED04)/4

要处理缺失值,请使用NULLIF或COALESCE:

(COALESCE(SPEED01, 0) + COALESCE(SPEED02, 0) + COALESCE(SPEED03, 0) + COALESCE(SPEED04, 0))

离开了分母。每个非null都需要加1。例如:

(COALESCE(SPEED01/SPEED01,0) + COALESCE(SPEED02/SPEED02,0) + ...)

您也可以使用CASE,具体取决于支持的SQL方言,以避免可能除以0:

CASE WHEN SPEED01 IS NULL THEN 0 ELSE 1

OR 您可以规范化数据,将所有SPEED提取为1:M关系并使用AVG聚合,避免所有这些问题。更不用说添加第5次测量的可能性,然后是第6次测量,依此类推等等!

答案 1 :(得分:0)

只需添加列并将它们除以4.处理"缺失"值使用coalesceNULL值视为零:

SELECT Test_No,
      (coalesce(Speed01,0) + coalesce(Speed02,0) + coalesce(Speed03,0) + coalesce(Speed04,0)) / 4 as "Average"
FROM Table01;

您没有提及您的DBMS(Postgres,Oracle,...),但上面是ANSI(标准)SQL,几乎可以在每个DBMS上运行。

答案 2 :(得分:0)

据我了解您的问题,我认为Table01.Speed01Table01.Speed03Table01.Speed04可以为空,类型为int,而Table01.Speed02可以为空且属于类型nvarchar

SELECT
    Table01.Test_No,
    (
        ISNULL(Table01.Speed01, 0) + 
        CASE ISNUMERIC(Table01.Speed02) WHEN 0 THEN 0 ELSE CAST(Table01.Speed02 AS int) END +
        ISNULL(Table01.Speed03, 0) + 
        ISNULL(Table01.Speed04, 0)
    )/4 AS AVG
FROM Table01