DB2/SQL 相当于 SAS 的 sum(of ) 函数

DB2/SQL equivalent of SAS's sum(of ) function

SAS 有一个 sum(of col1 - coln ) 函数,它计算 col1、col2、col3...coln 中所有值的总和。 (即,您不必列出所有列名,只要它们是连续编号的即可)。这是找到几个(适当命名的)变量之和的便捷快捷方式。

问题 - 是否有 DB2/SQL 等价物?我有 50 列(它们被命名为 col1、col2、col3....col50,我需要找到它们的总和。 即:

    select sum(col1, col2, col3,....,col50) AggregateSum
    from foo.table

不,至少据我所知,DB2 没有这样的野兽。但是,您可以动态地 创建这样的查询,方法是首先查询数据库元数据以提取给定 table.

的列

根据记忆,DB2 有一个 sysibm.syscolumns table,它基本上包含可用于动态构建查询的列信息。

您将首先使用如下查询:

select column for sysibm.syscolumns
where schema = 'foo' and tablename = 'table'
and column like 'col%'

(列名可能与 完全不匹配 但是,因为它们在 DB2 的不同变体上不相同(DB2/z,DB2/LUW , iSeries DB2, 等等) 无论如何,这无关紧要)。

然后使用 that 查询的结果来构造您的 actual 查询:

select col1+col2+...+colN AggregateSum from foo.table

其中 col1+col2+...+colN 位是根据之前的查询构建的。


如果正如您在评论中提到的那样,您只需要十八个 "highest" 列(例如,如果第 1 到 100 列存在,您只需要 83 到 100),您可以将第一个查询修改为这样做,像这样:

select column for sysibm.syscolumns
where schema = 'foo' and tablename = 'table'
and column like 'col%'
order by column desc
fetch first 18 rows only

但是,在这种情况下,您可能希望调用列 col0001col0145 等等,或者使排序能够处理可变宽度的数字。

尽管获取所有列可能更容易(如果您不能更改列名)colNNN,按照 col 之后的数字(非字符串)值自行对它们进行排序,并在构造第二个查询时丢弃除最后 18 以外的所有值。

这两个选项都将 return 最多只有十八行。


但在这种情况下,您可能还想考虑将可变数据移动到另一个 table,如果这在您的情况下可行的话。如果您 曾经 发现自己在 table 中维护一个数组,通常最好将其分开。

所以你的主要 table 会是这样的:

main_id         primary key
other_data

你的辅助 table 类似于:

main_id         foreign key to main(main_id)
sequence_nm
other_data
primary key (main_id, sequence_num)

这将允许您在需要时拥有稀疏数据,并且还可以添加数据而无需更改主 table 的模式。获取最新的 18 个结果的查询会稍微复杂 ,但仍然是两个 table 的相对简单的连接。