存储过程中的平均空列

时间:2012-07-13 08:13:25

标签: c# asp.net sql stored-procedures

我有一个存储过程,我想平均空列。

这是我的存储过程:

SELECT 
    AVG(planned) AS Planned,
    AVG(achieved) AS Achieved 
FROM 
    Port 
INNER JOIN 
    Technology ON Port.portID = Technology.portRef 

我使用datasource将此存储过程绑定到图表,当列为null时,C#代码会抛出此错误:

  

对于十进制,值太大或太小。

如何处理avg空列的存储过程?

4 个答案:

答案 0 :(得分:4)

当查询未返回任何值时会发生这种情况。使用此

SELECT 
    coalesce(avg(planned),0) as Planned,
    coalesce(avg(achieved),0) as Achieved 
FROM 
    Port inner join Technology on Port.portID = Technology.portRef 

答案 1 :(得分:2)

另一种方式

SELECT avg(isnull(planned,0))as Planned,avg(isnull(achieved,0))  as Achieved 
FROM Port inner join Technology on Port.portID = Technology.portRef 

答案 2 :(得分:0)

使用关键字unpivot

select id, AVG(Q)
from (select * from myTable) a
unpivot(Q for QQ IN(Q1,Q2,Q3,Q4,Q5)) b
group by id

如果所有列都是null,则它不会返回任何内容。

答案 3 :(得分:0)

我看到有几个人对是否使用ISNULLCOALESCE感到困惑。 我强烈推荐COALESCE。在某些情况下,两者都可以正常运行,但在某些情况下ISNULL如果处理不当会产生错误输出。

请查看以下代码段:

SELECT  
    ISNULL(Nullif('test', 'test'), '12345') AS using_isnull,
    COALESCE(Nullif('test', 'test'), '12345') AS using_coalesce,
    ISNULL(Nullif('test', 'test'), 12345) AS int_using_isnull,
    COALESCE(Nullif('test', 'test'), 12345) AS int_using_coalesce