gpt4 book ai didi

sql - 计算表中每一列的值

转载 作者:行者123 更新时间:2023-11-29 13:06:27 26 4
gpt4 key购买 nike

目前使用 Postgres 9.1。我正在寻找一种方法来获取特定表中每一列的计数。它有大约 600 列,如下所示:

CREATE TABLE geoproject.mes_wastab (
invid character varying(16)
, invtype character varying(3)
, smpid integer
, smpname character varying(40)
, smpdate date
, smptime character varying(5)
, o2st_p double precision
, wspgokna double precision
, o2_p double precision
, absenkungs double precision
, klarstrom3 double precision
, ...
);

列名应该从 information_schema.columns 中查询。应计算非空值。结果应如下所示:

column_name : count

我可以用 SQL 查询这个吗,还是我需要一个函数?

最佳答案

此查询将创建 DML 语句以获取您想要的内容。

SELECT 'SELECT ' || string_agg('count(' || quote_ident(attname) || ')', ', ')
|| 'FROM ' || attrelid::regclass
FROM pg_attribute
WHERE attrelid = 'mytbl'::regclass
AND attnum >= 1 -- exclude tableoid & friends (neg. attnum)
AND attisdropped is FALSE -- exclude deleted columns
GROUP BY attrelid;

返回:

SELECT count(col1), count(col2), count(col3), ...
FROM mytbl

您也可以自动执行它。但不是在计划 SQL 中,您需要在 plpgsql 函数或 DO 中执行 EXECUTE声明(PostgreSQL 9.0 或更高版本)。

对于 string_agg(),您还需要 Postgres 9.0 或更高版本功能。在旧版本中,您可以替换为:array_to_string(array_agg(...), ', ')

您可能想知道特殊转换 'mytbl'::regclass。阅读更多关于 object identifier types 的信息在手册中。

顺便说一句:默认情况下,NULL 值不会添加到 COUNT(col)

用(模式限定的)表名替换 mytbl。在你的情况下应该是:

...
WHERE attrelid = 'geoproject.mes_wastab'::regclass
...

如果您应该使用混合大小写或以其他方式弄乱标识符(注意引号):

...
WHERE attrelid = '"gEopRoject"."MES_wastab"'::regclass
...

关于sql - 计算表中每一列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9841568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com