2017-07-30 33 views
1

我正在嘗試計算記錄字段的值的次數,以便以後可以在應用程序中報告該數字。如何計算記錄中的NOT NULL字段的出現

我找到了幾種使用COUNT和GROUP BY的方法的答案,但結果是整個表的總髮生次數的總和。

我想限制每個記錄的計數。

Table Example: 
COL-1  COL-2  COL-3  COL-4 
VALUE    VALUE 
      VALUE    VALUE 
VALUE    VALUE  VALUE 
VALUE 

我需要計算每個記錄的字段值的出現次數。

類似的東西來:

Result Concept: 
COL-1  COL-2  COL-3  COL-4  Occurrences 
VALUE    VALUE     2 
      VALUE    VALUE   2 
VALUE    VALUE  VALUE   3 
VALUE          1 

澄清: 我實際上並不需要列出的結果列和值。我只需要每個記錄的準確計數。 我只想說明我的問題中「出現 - 價值」和記錄值之間的關係。

謝謝你的所有建議和意見。

+0

代表什麼樣的價值?計數是通過行而不是列完成的,以便執行您想要應用的小技巧。那麼,價值就是你想要總結的數字,或者是任何目前的價值,如果它存在,這意味着1出現? –

+0

還有另外一個問題,最終值是出現次數或出現次數的總和? –

+0

如果將列轉換爲行,則可以對其使用常規的「計數」。 –

回答

1

只需使用case

select t.*, 
     ((case when col1 is not null then 1 else 0 end) + 
     (case when col2 is not null then 1 else 0 end) + 
     (case when col3 is not null then 1 else 0 end) + 
     (case when col4 is not null then 1 else 0 end) 
     ) as occurrences 
from t; 
+0

完美!謝謝!! 現在我發現我不確定如何將該值與其記錄相關聯。 在一個存儲過程中,我試圖用一個單獨的表中的「總數」字段來更新該出現值。 它看起來像一個光標應該能夠使該過程可用的價值,但再次卡住在這種情況下如何正確對齊主鍵和外鍵的正確。 我會感謝您的任何建議。 – LearnsWhileDoing

+0

@LearnsWhileDoing。 。 。我建議你問另一個問題,並明確表示要更新表格。這一點很清楚地將結果作爲查詢返回。 –

0

或解碼;)

select t.*, DECODE(col1,null,0,1)+DECODE(col2,null,0,1)+ 
      DECODE(col3,null,0,1)+DECODE(col4,null,0,1) cnt 
from my_table t 
0

您可以使用動態SQL沒有列出所有列名

DECLARE @sql VARCHAR(MAX) 
DECLARE @tbl VARCHAR(100) 

SET @tbl = 'sampletable' -- put your table name here 

SET @sql = 'SELECT *, ' 

SELECT @sql = @sql + '(CASE WHEN ' + cols.name + ' IS NOT NULL THEN 1 ELSE 0 END) ' + '+' 
    FROM sys.columns cols 
WHERE cols.object_id = object_id(@tbl); 

SET @sql = LEFT(@sql, LEN(@sql) - 1) 
SET @sql = @sql + ' AS occurrences FROM ' + @tbl 

EXEC(@sql) 
相關問題