实际上我对我应该在这个主题上写的内容感到有点困惑。
关键是这样,我想平均Speed01,Speed02,Speed03
和Speed04
:
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)有数据。让我们说它取决于传感器捕捉测试材料速度的能力。
如果您能找到解决方案,那将是一个很大的帮助。我是新手。 谢谢你^^
答案 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.处理"缺失"值使用coalesce
将NULL
值视为零:
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.Speed01
,Table01.Speed03
,Table01.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