2011-06-09 40 views
1

我試圖獲得查詢中空字段的平均值。現在我正在製作:在查詢中獲取平均無空字段

select COUNT(name) as name 
,COUNT(surname) as surname 
    ,COUNT(email) as email from table where id = 1 

然後我手工總結所有,然後計算平均作出總領域劃分。我敢肯定,有一個更自動的廣告優雅的方式做到這一點,但我沒有看到它

謝謝!

EDIT例

查詢結果:

Name  Surname  Email 
----------------------------- 
John  Lennon  NULL 
Mary  NULL  NULL 
Peter  Clock  [email protected] 

總計字段:9 沒有空字段:6

平均無空字段:6/9 = 0.66 - >66%這就是我想要的

對不起,不清楚

+3

對於我來說,目前還不清楚你想要達到的目標。請提供樣本數據和預期產出。 – 2011-06-09 13:01:16

+0

你的意思是計數所有3列的所有行中的非空值?不是每列?或者計數/平均行數*爲null值? – gbn 2011-06-09 13:05:11

+0

對不起,我編輯了這個問題來添加一個例子 – Juan 2011-06-09 13:29:59

回答

1
  • COUNT(*)給出了簡單的行數
  • 3 * COUNT(*)G在表中
  • COUNT(colname的)元件的Ives的數目給出了在該列的非空值
  • COUNT(colname1)+ COUNT(colname2)+ COUNT(colname3)給出所有非空值

剩下的就是基本arithmatic一些隱含的十進制/浮點轉換除去整數除法問題

select 
    100.0 * 
    (
     COUNT(name) + COUNT(surname) + COUNT(email) 
    ) 
/
    (
     3 * COUNT(*) 
    ) 
from 
    table where id = 1 
+0

就是9!謝謝! – Juan 2011-06-09 13:45:46

+0

但是NOT NULL條件呢?我想我不明白。 – 2011-06-09 13:47:27

+2

@daemon_x:'COUNT(column)'*忽略*空值 – gbn 2011-06-09 13:48:35

0

選擇 avg(field_a)from table_xxx 其中field_a不爲空 group by id 這會給你一個很好的例子嗎? 我問這是因爲你所提到的查詢看起來很奇怪(是你的表歸?)

1

目前還不清楚你想要什麼,但只是猜測,嘗試:

​​3210
+0

總結count()是好的,但我必須除以字段的總數,在例子 – Juan 2011-06-09 13:31:42

1

我覺得這是非常效率不高方式,但它很容易理解,所以打我:)

DECLARE @TotalCount NUMERIC(5, 2) 
DECLARE @NullNameCount NUMERIC(5, 2) 
DECLARE @NullSurnameCount NUMERIC(5, 2) 
DECLARE @NullEmailCount NUMERIC(5, 2) 

SELECT @TotalCount = COUNT(0) FROM Table 

SELECT @NullNameCount = COUNT(0) FROM Table WHERE Name IS NOT NULL 
SELECT @NullSurnameCount = COUNT(0) FROM Table WHERE Surname IS NOT NULL 
SELECT @NullEmailCount = COUNT(0) FROM Table WHERE Email IS NOT NULL 

SELECT CAST((((@NullNameCount + @NullSurnameCount + @NullEmailCount)/@TotalCount) * 100.00) AS NUMERIC(5, 2))