平均我有3列(smallint
)的表在SQL Server 2005充分利用3列在SQL Server
Table Ratings
ratin1 smallint,
ratin2 smallint
ratin3 smallint
這些列可以從價值觀到0
5
。
如何選擇這些字段的平均值,但只能比較其值大於0
的字段。
所以如果列值是1
,3
,5
- 平均值必須是3
。 如果值爲0
,3
,5
- 平均值必須是4
。
平均我有3列(smallint
)的表在SQL Server 2005充分利用3列在SQL Server
Table Ratings
ratin1 smallint,
ratin2 smallint
ratin3 smallint
這些列可以從價值觀到0
5
。
如何選擇這些字段的平均值,但只能比較其值大於0
的字段。
所以如果列值是1
,3
,5
- 平均值必須是3
。 如果值爲0
,3
,5
- 平均值必須是4
。
這是一種快速和骯髒的,但它會工作...
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的時候你會得到零除,不是嗎? – 2010-03-15 17:02:02
+(CASE WHEN ratin 1 = 0 AND ratin2 = 0 AND ratin3 = 0 THEN 1 ELSE 0 END) – 2010-03-15 17:02:49
謝謝,沒錯!修改答案。 – mwigdahl 2010-03-15 17:08:51
您可以使用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.
我真的不認爲這是提問者想要的。當我讀到它時,他想在單行的範圍內平均ratin1,ratin2和ratin3。 – mwigdahl 2010-03-15 16:38:13
如果是這樣,那麼他們可以修改第一個SELECT語句來表示SELECT AVG(col1 + col2 + col3) – 2010-03-15 16:41:53
'AVG(col1 + col2 + col3)'是col1,col2和col3的總和行 – 2010-03-15 16:52:52
這是棘手比它看起來,但你可以這樣做:
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
@mwigdahl - 如果任何值爲NULL
,則會中斷。使用NVL
(值,默認值),以避免這種情況:
Sum columns with null values in oracle
編輯:在甲骨文裏,才能工作。在TSQL中,嘗試使用ISNULL()
聲明封裝每個字段。
select
(
select avg(v)
from (values (Ratin1), (Ratin2), (Ratin3)) as value(v)
) as average
這三個都是0時的平均值是多少? – 2010-03-15 16:35:34
澄清 - 你想在一行中找到ratin1,ratin2和ratin3的平均值,對嗎? – mwigdahl 2010-03-15 16:37:29
如果都是0,那麼我需要得到0 – barbarian 2010-03-15 16:55:26