我有一个平面表,包含数千行和更多十列。我想为每一行计算每列(非空)。
例如,我在这里有平面表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的所有列计数(非空值)。
我怎么能这样做?
答案 0 :(得分:4)
根据COUNT function documentation:
如果指定 expr ,则COUNT将返回 expr 不为空的行数。
因此您可以使用:
select aid, count(col1), count(col2), count(col3)
from t
group by aid
答案 1 :(得分:0)
考虑以下查询
select count(a), count(b), count(c)....
from table_name
或
select count(distinct a), count(distinct b), count(distinct c), ...
from table_name
如果你想计算不同的值
答案 2 :(得分:0)
Marco的答案是完美的。如果你的表很大并且计数的近似值是正常的,你可以查看数据字典。每次您(或您的DBA)调用DBMS_STATS.GATHER_TABLE_STATS时,它都会收集这些计数并将它们存储在视图中:
SELECT column_name, num_nulls
FROM user_tab_columns
WHERE table_name='A';
答案 3 :(得分:0)
如果您使用的是11g,则可以使用unpivot然后使用Aid计数:
select aid,count(*)
from tablea
unpivot
(
vals for col_name in (col1, col2, col3, ..., col10)
)
group by aid
order by aid