如何计算记录中NOT NULL字段的出现次数

时间:2017-07-30 20:56:39

标签: sql plsql oracle11g

我正在尝试计算记录字段具有值的次数,以便我可以稍后在应用程序中报告该数字。

我使用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

澄清: 我实际上不需要在结果中列出列和值。我只需要每个记录的准确计数。 我只是想在我的问题中说明“出现次数 - 值”与记录值之间的关系。

感谢您提出的所有建议和意见。

3 个答案:

答案 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;

答案 1 :(得分: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

答案 2 :(得分: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)