2009-08-17 41 views
0

使用Access 2003如果值不爲null,如何獲得行計數?

EmpID Value1 Value2 

001 100 
001  300 
001 200 400 
001 300 
001  250 
001 200 400 
002  100 
002 100 200 
003 500 100 
003 
003 700 
003 

...等,

我要計數(值)和計數(值2)不等於空。

預期產量。

EmpID Value1 Value2 

001  4  4 
002  1  2 
003  2  1 

...等,

如何計算的行值,如果它不等於空?

需要查詢幫助。

+0

你的領域是空的或空的字符串? – Fredou 2009-08-17 12:54:15

+0

@Fredou - 空值 – Gopal 2009-08-17 14:21:10

+0

您的期望是不正確的。你的003行應該有2和1不是1和0. – 2009-08-17 14:30:10

回答

0

我有效認爲我理解,但您可能需要稍微討論一下... Access數據庫引擎的IIF()函數執行測試,如果TRUE,則返回值1,否則返回值0.

select 
     EmpID, 
     sum(IIF(IsNull(Value1), 0, 1)) as Fld1WithValues, 
     sum(IIF(IsNull(Value2), 0, 1)) as Fld2WithValues 
    from 
     Table1 
    group by 
     EmpID; 

因此,儘管EmpID 1可能有6個條目,但是2是NULL,通過執行0或1的SUM(),所有記錄都會分別計算每個字段,並且不會丟失任何內容該情況下值1或值2的值爲空。他們在自己的價值觀上進行測試。

+0

@DRapp - 只獲取所有值的總數。 – Gopal 2009-08-17 14:22:30

+0

該查詢將返回COUNTS ..即使它是一個SUM()聚合。如果值爲NULL,則返回0,否則返回1.因此,對於員工1 ID,您可以在Value1字段計數下求和:1 + 0 + 1 + 1 + 0 + 1 = 4,總和爲:0 + 1 +對於Value2字段計數,1 + 0 + 1 + 1 = 4。 – DRapp 2009-08-17 15:59:11

2

這似乎工作?

SELECT Table1.Field1, Count(Table1.Field2) AS CountOfField2, Count(Table1.Field3) AS CountOfField3 
FROM Table1 
GROUP BY Table1.Field1; 

,並在你的例子,003是2和1,而不是1和0

結果是:

Field1 CountOfField2 CountOfField3 
1   4    4 
2   1    2 
3   2    1 

這似乎是,如果場均NULL

+0

@Fredou。它顯示行的總數,我只需要行數不等於null – Gopal 2009-08-17 12:49:09

+0

對於我運行上面的查詢給我,001:4,4 002:1,2 003:2,1 – Fredou 2009-08-17 12:53:39

+0

將此添加到最後並看看會發生什麼: WHERE isnull(Value1,'null')<>'null'或isnull(Value2,'null')<>'null' – 2009-08-17 13:00:18

1

如果你想整個表格去

SELECT 
    SUM (IIF(value1 IS NULL, 0, 1)) as NumNonNullValue1, 
    SUM (IIF(value2 IS NULL, 0, 1)) as NumNonNullValue2 

FROM Employee 

但如果你想非空值每名僱員的ID,然後在

SELECT 
    EmpID, 
    SUM (IIF(value1 IS NULL, 0, 1)) as NumNonNullValue1, 
    SUM (IIF(value2 IS NULL, 0, 1)) as NumNonNullValue2 

FROM Employee 

GROUP BY EmpID 

當然,有時只是通過EMPID是用於查詢有用的,但不用於顯示。您需要名稱,所以我們添加名稱字段(s)

SELECT 
    EmpID, 
    EmployeeName, 
    SUM (IIF(value1 IS NULL, 0, 1)) END as NumNonNullValue1, 
    SUM (IIF(value2 IS NULL, 0, 1)) END as NumNonNullValue2 

FROM Employee 

GROUP BY EmpID, EmpoyeeName 
+0

@Raj - 我得到了所有值的總數。我沒有得到非空值的總數 – Gopal 2009-08-17 14:19:39

+0

對不起,我錯過了訪問2003年的一部分。我用SQL Server語法回答。 – 2009-08-17 14:24:36

0

這是一個Access特定的答案,但這是原始問題的上下文。您想要計算非Null值的發生率,而不是記錄的數量。幾個答案已經使用IIF()測試空,但您可以用ISNULL()和ABS()這樣做更容易:

SELECT EmpID, Abs(Sum(Not IsNull([Value1]))) As Value1Count, 
    Abs(Sum(Not IsNull([Value2]))) As Value2Count 
    FROM MyTable 
    GROUP BY EmpID 

這似乎要簡單得多我比使用IIF()。

+0

更簡單的是在旁觀者的眼中;)當它被移植到「合適的」SQL實現時,IIF()更容易轉換爲CASE..WHEN..ELSE..END表達式。 – onedaywhen 2009-08-18 15:10:05

+0

我認爲當你說「正確」時,你拼錯了「不同」。 – 2009-08-18 17:12:36

+0

'正確'=符合ISO SQL標準的現代,工業實力,專用SQL產品。 Access數據庫引擎不支持SQL-92 CASE表達式語法有什麼好理由嗎? – onedaywhen 2009-08-19 08:47:18