如何找到表中的所有 NUMERIC 列并对它们执行 SUM() ?

Posted

技术标签:

【中文标题】如何找到表中的所有 NUMERIC 列并对它们执行 SUM() ?【英文标题】:How do I find all the NUMERIC columns in a table and do a SUM() on them? 【发布时间】:2016-01-10 23:41:43 【问题描述】:

我在 Netezza、DB2 和 PostgreSQL 数据库中有一些表,我需要对其进行协调,我们得出的最佳方法是对所有 3 个数据库上的所有 NUMERIC 表列执行 SUM()。

有没有人有一种快速而简单的方法来查找所有的列,无论是 NUMERIC、INTEGER 还是 BIGINT,然后对所有这些列运行 SUM()?

为了比较结果,我也可以手动进行,或者如果有人有办法在一个公用表中捕获这些结果并自动检查 SUM 中的差异?

【问题讨论】:

...比较总和可能会使您得到不正确的结果。例如,如果一行后来被分成两行,每行有一半的值。您忘记了 DECIMAL 类型。非数字数据呢?为什么不那么重要?设置跨数据库复制怎么样?另外,三个数据库?无论如何,您都需要一些非常强大的动态 SQL 来完成这项工作。 @Clockwork-Muse 是的,完全同意这一点。还有很多其他测试来确定完整的堆栈,但现在只寻找 SUM()。由于我们正在从 Netezza 迁移到具有 PostgreSQL 的 Cloud,因此必须跨 3 进行。 【参考方案1】:

对于 DB2,您可以使用此元数据,这将帮助您找出每列的数据类型

SELECT
               COLUMN_NAME || ' ' || REPLACE(REPLACE(DATA_TYPE,'DECIMAL','NUMERIC'),'CHARACTER','VARCHAR') || 
               CASE 
                              WHEN DATA_TYPE = 'TIMESTAMP' THEN '' 
                              ELSE
                                             ' (' ||
                                             CASE 
                                                            WHEN CHARACTER_MAXIMUM_LENGTH IS NOT NULL THEN CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(30))
                                                            WHEN NUMERIC_PRECISION IS NOT NULL THEN CAST(NUMERIC_PRECISION AS VARCHAR(30)) || 
                                                                           CASE 
                                                                                          WHEN NUMERIC_SCALE = 0 THEN ''
                                                                                          ELSE ',' || CAST(NUMERIC_SCALE AS VARCHAR(3)) 
                                                                           END
                                                            ELSE ''
                                             END || ')'
               END || ',' "SQLCOL",
               COLUMN_NAME,
               DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, ORDINAL_POSITION
FROM SYSIBM.COLUMNS
WHERE TABLE_NAME = 'insert your table name'
AND TABLE_SCHEMA = 'insert your table schema'
ORDER BY ORDINAL_POSITION

【讨论】:

【参考方案2】:

对于 Netezza,我得到以下查询:

SELECT 0 AS ATTNUM, 'SELECT' AS SQL
UNION
SELECT ATTNUM, 'SUM(' || ATTNAME || ') AS S_' || ATTNAME || ',' AS COLMN
FROM _V_RELATION_COLUMN RC
WHERE NAME = '<table-name>'
AND FORMAT_TYPE= 'NUMERIC'
UNION
SELECT 10000 AS ATTNUM, ' 0 AS FLAG FROM ' || '<table-name>'
ORDER BY ATTNUM

仍在寻找如何跨 DB2 和 PostgreSQL 执行此操作。

【讨论】:

以上是关于如何找到表中的所有 NUMERIC 列并对它们执行 SUM() ?的主要内容,如果未能解决你的问题,请参考以下文章

plsql-Oracle 集合

如何从表中选择所有列并计数?

如何将distinct应用于特定列并从JPA中的表中获取所有值(Criteria Builder)

VBA选择工作表中的所有列并自动调整Excel 2010中的所有列宽度

如何在所有表中查找特定列并在 PostgreSQL 中修改该列的值

使用 group by 汇总列并存储为 MySQL 中的新列(永久)