2017-02-24 69 views
0

我有我已示出的下方的簡化示例的表:計數數不爲空 - MS訪問SQL

ID | Item1 | Item2 | Item3 | Item4 | Item5 
------------------------------------------ 
A | NULL | NULL | YES | YES | NULL 
B | NULL | NULL | NULL | YES | NULL 
C | NULL | NULL | NULL | NULL | NULL 

欲返回以下數據集:

ID | Count 
------------ 
A | 2 
B | 1 
C | 0 

iee我想的是如何列的多不NULL該ID的計數

一個潛在的解決方案是

SELECT 
    ID, 
    SUM(
    IIf(Item1 is NULL,0,1) 
    + 
    IIf(Item2 is NULL,0,1) 
    + 
    IIf(Item3 is NULL,0,1) 
    + 
    IIf(Item4 is NULL,0,1) 
    + 
    IIf(Item5 is NULL,0,1) 
    ) 'Count' 
FROM 
    tableName 
GROUP BY 
    ID 

然而,在實踐中我使用的是真正的表有一百多列,我寧願以避免必須寫出每列的名稱。有沒有更簡單的方法來做到這一點?

回答

2

這將循環您可以使用VBA來通過每個記錄和字段循環:

Function CountFields() 
Set db = CurrentDb() 
db.Execute ("delete * from ItemCounts") 
Set RS = db.OpenRecordset("select * from [DataTable]") 
RS.MoveFirst 
Do While Not RS.EOF 
    Id = RS.Fields("ID").Value 
    Count = 0 
    For Each Item In RS.Fields 
     If (Item.Name <> "ID" And RS.Fields(Item.Name).Value <> "") Then Count = Count + 1 
     Next Item 
    db.Execute ("insert into ItemCounts (ID,[count]) select " & Id & "," & Count) 
    RS.MoveNext 
    Loop 
MsgBox ("done") 
End Function 

這使計數表稱爲ItemCounts,這就需要在VBA執行之前設置。該表中的字段是ID和計數。

而且,如果您可以重新格式化源數據,我同意Minty--但我知道這並不總是可行的。

+0

謝謝唐喬治。是的,我剛決定走這條路。感謝您將此代碼放在一起。我曾希望有一些方法可以用SQL來完成,但最重要的是找到可行的解決方案,因爲這樣做 – Leroy

1

可以縮小它一點:

SELECT 
    ID, 
    ABS(SUM((Item1 is Not NULL)+(Item2 is Not NULL)+(Item3 is Not NULL)+(Item4 is Not NULL)+(Item5 is Not NULL))) As [Count] 
FROM 
    tableName 
GROUP BY 
    ID 
+0

謝謝古斯塔夫,我沒有想到這一點,這是更好一點。我已經決定使用VBA來實現這一點,但我仍然有興趣查看是否可以用純SQL來完成,如果僅僅是出於好奇 – Leroy

2

你的數據不被標準化,因此你不必在你的代碼執行體操解決該問題。

您的數據應垂直存儲而不是水平存儲;

ID | ItemNo | Value 
--------------------- 
A | 2  | 1  
A | 3  | 1 
B | 4  | 1 

這將使您的查詢成爲一個簡單的總查詢,並允許任意數量的項目。當你有一些不是每個案例時,你也只能存儲數據。

編輯:在田野

Dim Rst As Recordset 
Dim f As Field 

Set Rst = CurrentDb.OpenRecordset(TableName) 
For Each f In Rst.Fields 
    Debug.Print (f.name) 
Next 
Rst.Close 
+1

我同意數據應該垂直存儲。我繼承了當前狀態的數據庫,並且可能不得不徹底改變表的結構。我處於需要在某個截止日期前完成更新的職位,希望能夠在此之前找到更快捷的解決方法。我想知道是否有一種有效的方法來使用SQL來做到這一點,但現在已經走下了使用VBA循環遍歷記錄集中的字段並以這種方式遞增計數器的路線。 – Leroy