【问题标题】:How to take count of data in flat table如何计算平表中的数据
【发布时间】:2013-06-24 09:00:51
【问题描述】:

我有一张包含数千行和十多列的平面表。我想计算每一行的每一列(非空)。 例如,在这里我有一个平面表说table A

+=====+======+======+======+=====+======+
| Aid | col1 | col2 | col3 | ... |col10 |
+=====+======+======+======+=====+======+
|  1  |   a  |   b  |   c  | ... |   x  |
+-----+------+------+------+-----+------+
|  2  |   a  |   b  |   c  | ... |   x  |
+-----+------+------+------+-----+------+
|  3  |   a  |   b  |   c  | ... |   x  |
+-----+------+------+------+-----+------+

现在,我想在单个查询中计算所有 Aid 的所有列(非空)。 例如,如果我计算 col1,那么我需要使用 select count(*) from A where col1 is not null; 但我想要单个查询中表中每个 Aid 的所有列数(不是空值)。 我怎么能这样做?

【问题讨论】:

  • 每个Aid 是什么意思?在你的例子中它是独一无二的......
  • 是的,Aid 是唯一的。我想说,如果所有列包含某个值,则 Aid 1 的值计数为 10,如果一列包含空值而其他列具有某些值,则值为 9。
  • 好的,现在你的问题很清楚了——你想计算包含每一行值的列。

标签: sql oracle


【解决方案1】:

根据COUNT function documentation

如果指定 expr,则 COUNT 返回 expr 不为空的行数。

因此你可以使用:

select aid, count(col1), count(col2), count(col3)
  from t
 group by aid

【讨论】:

    【解决方案2】:

    考虑以下查询

    select count(a), count(b), count(c)....
      from table_name
    

    select count(distinct a), count(distinct b), count(distinct c), ...
      from table_name
    

    如果你想计算不同的值

    【讨论】:

      【解决方案3】:

      Marco 的回答是完美的。如果您的表很大并且计数的近似值还可以,那么您不妨看看数据字典。每次您(或您的 DBA)调用 DBMS_STATS.GATHER_TABLE_STATS 时,它都会准确收集这些计数并将它们存储在视图中:

      SELECT column_name, num_nulls 
        FROM user_tab_columns 
       WHERE table_name='A';
      

      【讨论】:

        【解决方案4】:

        如果您使用的是 11g,则可以使用 unpivot,然后按 Aid 分组计数:

        select aid,count(*) 
        from tablea
        unpivot
        (
          vals for col_name in (col1, col2, col3, ..., col10)
          )
        group by aid
        order by aid
        

        Here is a sqlfiddle demo

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-23
          • 2017-09-24
          • 1970-01-01
          • 2020-12-16
          • 1970-01-01
          • 1970-01-01
          • 2021-07-21
          • 2016-10-21
          相关资源
          最近更新 更多