从表中选择一组动态列并获取每个列的总和

2023-12-13

是否可以在 Postgres 中执行以下操作:

SELECT column_name FROM information_schema WHERE table_name = 'somereport' AND data_type = 'integer';

SELECT SUM(coulmn_name[0]),SUM(coulmn_name[1]) ,SUM(coulmn_name[3]) FROM somereport;

换句话说,我需要根据特定条件从表中选择一组列,然后对表中的每一列求和。

我知道我可以在循环中执行此操作,因此我可以独立计算每个列,但显然这需要对从信息模式查询返回的每个列进行查询。例如:

FOR r IN select column_name from information_schema where report_view_name = 'somereport' and data_type = 'integer';
LOOP
    SELECT SUM(r.column_name) FROM somereport;
END

此查询创建您想要的完整 DML 语句:

WITH x AS (
   SELECT 'public'::text     AS _schema  -- provide schema name ..
         ,'somereport'::text AS _tbl     -- .. and table name once
   )
SELECT 'SELECT ' || string_agg('sum(' || quote_ident(column_name)
                 || ') AS sum_' || quote_ident(column_name), ', ')
       || E'\nFROM   ' || quote_ident(x._schema) || '.' || quote_ident(x._tbl)
FROM   x, information_schema.columns
WHERE  table_schema = _schema
AND    table_name = _tbl
AND    data_type = 'integer'
GROUP  BY x._schema, x._tbl;

您可以单独执行它或将此查询包装在 plpgsql 函数中并使用以下命令自动运行查询EXECUTE:

全自动化

使用 PostgreSQL 9.1.4 进行测试

CREATE OR REPLACE FUNCTION f_get_sums(_schema text, _tbl text)
  RETURNS TABLE(names text[], sums bigint[]) AS
$BODY$
BEGIN

RETURN QUERY EXECUTE (
    SELECT 'SELECT ''{'
           || string_agg(quote_ident(c.column_name), ', ' ORDER BY c.column_name)
           || '}''::text[],
           ARRAY['
           || string_agg('sum(' || quote_ident(c.column_name) || ')'
                                                   , ', ' ORDER BY c.column_name)
           || ']
    FROM   '
           || quote_ident(_schema) || '.' || quote_ident(_tbl)
    FROM   information_schema.columns c
    WHERE  table_schema = _schema
    AND    table_name = _tbl
    AND    data_type = 'integer'
    );

END;
$BODY$
  LANGUAGE plpgsql;

Call:

SELECT unnest(names) AS name, unnest (sums) AS col_sum
FROM   f_get_sums('public', 'somereport');

返回:

   name        | col_sum
---------------+---------
 int_col1      |    6614
 other_int_col |    8364
 third_int_col | 2720642

Explain

困难在于定义RETURN函数的类型,而返回的列的数量和名称会有所不同。一个有点帮助的细节:你只想要integer列。

我通过形成一个数组解决了这个问题bigint (sum(int_col)回报bigint)。此外,我还返回一个列名称数组。两者均按列名称的字母顺序排序。

在函数调用中,我将这些数组分开unnest()到达显示的漂亮格式。

动态创建和执行的查询是高级的东西。不要对多层引号感到困惑。基本上你有EXECUTE它接受一个包含要执行的 SQL 查询的文本参数。该文本又由构建主查询的查询字符串的辅助 SQL 查询提供。

如果一次太多或者plpgsql对你来说相当新鲜,从这个相关答案我在其中解释了处理更简单功能的基础知识,并提供了主要功能手册的链接。

If 表现必须直接查询 Postgres 目录(pg_catalog.pg_attributes)而不是使用标准化(但速度慢)information_schema.columns。这里有一个简单的例子pg_attributes.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从表中选择一组动态列并获取每个列的总和 的相关文章

  • Mysql为简单频繁查询创建排序索引性能

    我正在处理一个包含大约 400 万条消息条目的 mysql 表 并尝试根据时间戳选择最新的 50 条消息 另一个要求是返回的消息不以固定前缀开头 问题是单个查询大约占用 25 的 cpu 并且最多需要 1 5 秒 该查询经常由多个客户端执行
  • 为什么我们不能有多个主键?

    我知道表中不能有超过 1 个主键 但技术原因是什么 直接拉取自SO https stackoverflow com questions 217945 can i have multiple primary keys in a single
  • 使用另一个表中的数据查找并替换 MySQL 中的字符串

    我有两个 MySQL 表 我想使用另一个表中的数据查找和替换一个表中的文本字符串 Table texts messages thx guys i think u r great thx again u rock Table dictiona
  • 从多个表中选择 - 一对多关系

    我有这样的表 表产品 身份证 姓名 表格图像 产品 ID 网址 订单号 表价 产品 ID 组合 货币 价格 表数量 产品 ID 组合 数量 表 Product 与其他表是一对多关系 我需要查询表并得到类似这样的结果 伪数组 ProductI
  • MySql如何通过过滤多列来限制多个数字?

    我想从数据库中获取 4 个不同类别的 50 个问题 我想要 4 个不同类别中每个类别的不同数量的问题 我的结果集必须包含第一类 12 个问题 第二类 20 个问题 第三类 10 个问题和第四类 8 个问题 我的问题表中总共有 50 个问题
  • Oracle:如何查找模式中上次更新(任何表)的时间戳?

    有一个Oracle数据库模式 数据很小 但仍然有10 15个表左右 它包含一种配置 路由表 有一个应用程序必须不时轮询此架构 不得使用通知 如果架构中没有数据更新 应用程序应使用其当前的内存版本 如果任何表有任何更新 应用程序应将所有表重新
  • 在 plsql 中立即执行

    如何从这段代码中得到结果 EXECUTE IMMEDIATE SELECT FROM table name through for loop 通常的方法看起来像这样 for items in select from this table l
  • Rails 多租户架构,限制多个租户的访问范围

    目前我们有一个单租户数据库架构 MySQL 运行着超过 100 个数据库 我们使用 Apartment gem 切换子域上的数据库连接 一切都很顺利 然而 我们现在需要创建所谓的 伞 客户端 它可以访问一组现有客户端的所有数据 我不认为这对
  • 整理有关 QueryDSL-JPA 的提示

    有没有办法用 QueryDSL 来执行它 粗体部分 从地点选择 其中名称如 cafe 整理 Latin1 general CI AI 我将 JPA 与 hibernate 一起使用 您可以使用addFlag QueryFlag Positi
  • 从存储过程中的动态 SQL 获取结果

    我正在编写一个存储过程 需要在过程中动态构造 SQL 语句以引用传入的表名称 我需要让这个 SQL 语句返回一个结果 然后我可以在整个过程的其余部分中使用该结果 我尝试过使用临时表和所有内容 但我不断收到一条消息 提示我需要声明变量等 例如
  • 在 Oracle 中使用触发器记录对表的更改

    我的一门课有一个项目 当我们的两个表发生更改时 我们需要创建一个日志 插入 更新 删除 我们需要使用Oracle触发器和PL SQL 在日志文件中 我们需要记录用户ID 日期时间 IP地址和事件 插入 更新 删除 我知道如何设置触发器 但我
  • 使用MySQL计算单个表中借方和贷方的余额

    下面的 MySQL 表包含带有关联金额的借方或贷方 操作 如何选择具有非零 余额 的所有 CLIENT ID 我尝试将表连接到自身以计算所有借方和贷方总额 但有些东西无法正常工作 CLIENT ID ACTION TYPE ACTION A
  • SQL - 为每条记录调用存储过程

    我正在寻找一种方法来为 select 语句的每条记录调用存储过程 SELECT SomeIds SELECT spro Id FROM SomeTable as spro INNER JOIN Address addr ON addr Id
  • Postgres、更新和锁定顺序

    我正在研究 Postgres 9 2 有 2 个更新 每个更新都有自己的事务 一个看起来像 UPDATE foo SET a 1 WHERE b IN 1 2 3 4 另一个也类似 UPDATE foo SET a 2 WHERE b IN
  • SQL Server 相当于 MySQL 的 USING

    在 MySQL 中 当您连接不同表中具有相同名称的列时 可以在连接中使用关键字 USING 例如 这些查询产生相同的结果 SELECT FROM user INNER JOIN perm USING uid SELECT FROM user
  • 在 Postgres 中的数组字段上应用聚合函数?

    是否可以对整数 字段 或其他数字数组 中的所有值应用聚合 如 avg stddev CREATE TABLE widget measurement integer insert into widget measurement values
  • 更新plpgsql中触发器函数中的多列

    给出以下架构 create table account type a id SERIAL UNIQUE PRIMARY KEY some column VARCHAR create table account type b id SERIA
  • 将多行合并为一行并根据行数附加列

    我正在尝试将同一个表的多行合并为一个 我有一个像这样的示例表 Col1 Col2 Col3 Col4 Col5 Col6 1 BH1 CB 12 CC CC Conveyor Mal 1 BH1 CB 104 ZC ZC Full Emp
  • Oracle:如果表存在

    我正在为 Oracle 数据库编写一些迁移脚本 并希望 Oracle 有类似于 MySQL 的东西IF EXISTS构造 具体来说 每当我想删除 MySQL 中的表时 我都会执行类似的操作 DROP TABLE IF EXISTS tabl
  • 在存储过程结束时显式删除本地临时表有什么好处?

    考虑以下伪 T SQL 代码 由存储过程执行 CREATE TABLE localTable

随机推荐

  • 如何在 Java 中打开 equals 语句以接受多个参数?

    我有一个梦想 在这个梦中 我可以替换这样的结构 if aLongVariableName equals classInstance aPropertyOfThatInstance aLongVariableName equals class
  • 如何使用 swift 4 在 iOS 11 上播放声音?我把 mp3 文件放在哪里?

    我看了很多教程 但是当我单击按钮 激活功能播放声音 时 声音不播放 我看到了 stackoverflow 推荐的代码 但什么也没有 我把mp3文件信息asset xcasset 这是正确的 SWIFT 4 Xcode 9 1 import
  • 自动将 Excel 文件转换为 Google Sheets

    我有一个使用保存电子邮件和附件插件的谷歌帐户 https chrome google com webstore detail save emails and attachmen nflmnfjphdbeagnilbihcodcopheceb
  • Pandas 无法计算具有重复轴的 isin

    我的数据框是这样的 userid codeassigned timestamp 15 553938 M1 1499371200000 15390 527638 M2 1599731200000 15389 521638 M2 1399901
  • 一个类只有 5 个实例 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我希望在整个应用程序生命周期中只有 5 个类的实例 我怎样才能实现这个目标 如果
  • 此版本的应用程序未配置为通过 Google Play 计费[重复]

    这个问题在这里已经有答案了 可能的重复 此版本的应用程序未配置为通过 Google Play 计费 我已经在 Android 市场上有一个应用程序 带有应用程序内购买 我的问题是应用内购买功能无法正常工作 我再次重写了代码 现在我想运行该应
  • 如何在 Hibernate 应用程序中处理数据库空值?

    由于数据库表中的空值 我收到 org hibernate PropertyAccessException 异常如何处理 我的文件是 获取测试 java package com raj java hiberanteDemos import o
  • 是否可以将 NFC 信号从 NFC 读/写器发送到 Iphone

    我正在创建一个移动应用程序 它根据 PC 上生成的 ID 获取数据 我想将此 ID 作为文本字符串从我的 NFC 设备传递 当用户触摸 NFC 设备时 该设备支持读取和写入 iPhone 设备 这可能吗 我使用 Acr 122u 作为 NF
  • 在android中设置listview滚动动画

    我想为一个设置动画ListView当用户滚动ListView 我正在设置动画ListView加载时 但我想设置滚动动画 这是我在 eclipse 中的动画文件
  • Linkedin v2 API 图片上传出现错误 400 Bad Request

    当我每次尝试使用 LinkedIn v2 API 上传图像时 都会收到 400 Bad request 错误 参考资料取自这里 Link 我在邮递员中执行的步骤 步骤1 应用程序编程接口 https api linkedin com v2
  • MySql修改预购树创建url

    这个问题是基于我之前的问题堆栈溢出 这次我尝试使用修改后的预购树方法为页面表中的所有行生成 url 以下是 MySql 表 注意 我添加了 父 列 只是为了让查看者了解类别表中的父子关系 实际的Modified Preorder Tree方
  • 是否可以镜像 ActiveMQ 中的单个队列?

    我在生产系统中运行 ActiveMQ 我们的一些队列数量非常多 有些队列数量非常少 我有兴趣镜像低容量队列之一 以便我可以围绕收到的消息构建非正式的监视服务 很遗憾 我能找到的唯一文档似乎暗示镜像队列是全有或全无 您要么为您拥有的每个队列创
  • 如何将日期时间选择器添加到 contenteditable

    如何使用 jquery 在可编辑的内容中添加日期和时间选择器 这是我的 td td class dq1 row dq1 td 这是我的脚本 datepicker datepicker dateFormat yyyy mm dd showOn
  • 使用 Direct X 和 VS2012

    我拥有适用于桌面版和适用于 Windows 8 的 Visual Studio 2012 Express 并且我想创建 Direct X 应用程序和游戏 我知道现在有一个Windows SDK 并且在win8的VS 2012 exp中IDE
  • “提交”审核按钮变灰 - Xcode 6 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我正在尝试提交我的第一个 iOS 8 应用程序 并且正在执行 Apple iTunes 连接的新程序 我已经上传了我的二进制文件 填写了所有详细信息并上传了所有屏幕截图 然后
  • 匹配 [g]awk 中的数字

    我被难住了 尝试编写 awk 正则表达式来将字符串与 11 位数字进行匹配 我试过了 if var 0 9 11 if var 0 9 11 if var 0 9 11 if var 0 9 11 altho I really do nee
  • Qt 调整轴不会调整图表本身

    我目前正在尝试了解 Qt 中的折线图 由于某种原因 我的图表似乎显示出非常奇怪的行为 当我使用 createDefaultAxis 时 它将根据图表后面系列的最小值和最大值设置最小值和最大值 虽然乍一看这似乎没问题 但它已经与中的行为不同了
  • JavaScript 原生 groupBy 减少

    我正在使用 JavaScript 原生reduce 但是我想稍微改变一下分组以获得我想要的结果 我有一个数组如下 const people name John age 23 city Seattle state WA name Mark a
  • 是否可以在VBA中将Excel表转换为json

    我需要将大约二十列和很多行的 Excel 表中的数据转换为 json 我在 vba 中没有找到用于此目的的简短代码示例 我找到了这个https github com VBA tools VBA JSON blob master JsonCo
  • 从表中选择一组动态列并获取每个列的总和

    是否可以在 Postgres 中执行以下操作 SELECT column name FROM information schema WHERE table name somereport AND data type integer SELE