【问题标题】:How do I count the occurrences of NOT NULL fields in a record如何计算记录中 NOT NULL 字段的出现次数
【发布时间】:2017-07-30 20:56:38
【问题描述】:

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

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

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

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

【问题讨论】:

  • 价值代表什么?计数是按行而不是按列完成的,要执行您想要的操作,需要应用一个小技巧。那么 value 是一个你想要求和的数字,还是只是任何现值,如果它存在就意味着 1 出现?
  • 还有一个问题,最终的值是出现的总和还是出现的列表?
  • 如果您将列转为行,您可以在它们上使用常规的count

标签: sql plsql oracle11g


【解决方案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;

【讨论】:

  • 完美!谢谢!!现在我发现我不确定如何将该值与它的记录相关联。在存储过程中,我试图用该出现值更新单独表中的“总计数”字段。似乎 Cursor 应该能够使该值可用于该过程,但在这种情况下,我再次陷入如何正确对齐主键和外键的问题。如有任何建议,我将不胜感激。
  • @LearnsWhileDoing 。 . .我建议您再问一个问题,并明确您想要 update 表。这很明显是关于将结果作为查询返回。
【解决方案2】:

或解码;)

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

【讨论】:

    【解决方案3】:

    您可以使用动态 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 2018-12-30
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多