2010-03-15 59 views
3

平均我有3列(smallint)的表在SQL Server 2005充分利用3列在SQL Server

Table Ratings 
ratin1 smallint, 
ratin2 smallint 
ratin3 smallint 

這些列可以從價值觀到05

如何選擇這些字段的平均值,但只能比較其值大於0的字段。

所以如果列值是1,3,5 - 平均值必須是3。 如果值爲035 - 平均值必須是4

+0

這三個都是0時的平均值是多少? – 2010-03-15 16:35:34

+0

澄清 - 你想在一行中找到ratin1,ratin2和ratin3的平均值,對嗎? – mwigdahl 2010-03-15 16:37:29

+0

如果都是0,那麼我需要得到0 – barbarian 2010-03-15 16:55:26

回答

9

這是一種快速和骯髒的,但它會工作...

SELECT (ratin1 + ratin2 + ratin3)/
((CASE WHEN ratin1 = 0 THEN 0 ELSE 1 END) + 
(CASE WHEN ratin2 = 0 THEN 0 ELSE 1 END) + 
(CASE WHEN ratin3 = 0 THEN 0 ELSE 1 END) + 
(CASE WHEN ratin1 = 0 AND ratin2 = 0 AND ratin3 = 0 THEN 1 ELSE 0 END) AS Average 
+0

當三個都是0的時候你會得到零除,不是嗎? – 2010-03-15 17:02:02

+0

+(CASE WHEN ratin 1 = 0 AND ratin2 = 0 AND ratin3 = 0 THEN 1 ELSE 0 END) – 2010-03-15 17:02:49

+0

謝謝,沒錯!修改答案。 – mwigdahl 2010-03-15 17:08:51

-2

您可以使用AVG()函數。這將得到一列的平均值。因此,您可以使用AVG()方法嵌套SELECT語句,然後選擇這些值。

僞:

SELECT col1, col2, col3 
    FROM (
    SELECT AVG(col1) AS col1, AVG(col2) AS col2, AVG(col3) AS col3 
     FROM table 
) as tbl 
WHERE col1 IN (0, 3, 5) 
etc. 
+0

我真的不認爲這是提問者想要的。當我讀到它時,他想在單行的範圍內平均ratin1,ratin2和ratin3。 – mwigdahl 2010-03-15 16:38:13

+0

如果是這樣,那麼他們可以修改第一個SELECT語句來表示SELECT AVG(col1 + col2 + col3) – 2010-03-15 16:41:53

+0

'AVG(col1 + col2 + col3)'是col1,col2和col3的總和行 – 2010-03-15 16:52:52

0

這是棘手比它看起來,但你可以這樣做:

SELECT dbo.MyAvg(ratin1, ratin2, ratin3) from TableRatings 

如果您創建此功能第一:

CREATE FUNCTION [dbo].[MyAvg] 
(
    @a int, 
    @b int, 
    @c int 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @result int 
    DECLARE @divisor int 
    SELECT @divisor = 3 

    IF @a = 0 BEGIN SELECT @divisor = @divisor - 1 END 
    IF @b = 0 BEGIN SELECT @divisor = @divisor - 1 END 
    IF @c = 0 BEGIN SELECT @divisor = @divisor - 1 END 

    IF @divisor = 0  
     SELECT @result = 0 
    ELSE 
     SELECT @result = (@a + @b + @c)/@divisor 

    RETURN @Result 

END 
1

@mwigdahl - 如果任何值爲NULL,則會中斷。使用NVL(值,默認值),以避免這種情況:

Sum columns with null values in oracle

編輯:在甲骨文裏,才能工作。在TSQL中,嘗試使用ISNULL()聲明封裝每個字段。

-1
select 
(
    select avg(v) 
    from (values (Ratin1), (Ratin2), (Ratin3)) as value(v) 
) as average