我需要计算6列的平均值,但是当有空字段时我不想计算它。
例如,如果我有(2,3,2,3,2,3)我应该得到15/6 = 2,5但是当它是(2,3,2,3,'空','空')我需要10/4 = 2,5。
如何实现这一目标?
这是6列的平均值,我不能使用avg函数,它默认忽略NULL。
答案 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)
你面临两个问题:
您必须将字符串转换为数字,并避免使用空字符串和空字符串。
您需要计算列的平均值,因此只要数据采用该格式,avg
函数就无法使用。
基本上有两种可能的方法,您可以使用列值,也可以将列转换为行。
使用列值自然会变得重复。您必须转换每个列,并检查有多少可用列:
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