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



SAS有一个sum(of col1 - column)函数,用于查找col1, col2, col3…列中所有值的和。(即,您不必列出所有列名,只要它们连续编号即可)。这是查找几个(适当命名的)变量的和的方便快捷方式。

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

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

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

在内存中,DB2有一个sysibm.syscolumns表,它基本上包含可以用来动态构造查询的列信息。

首先使用如下查询:

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

(列名可能不完全匹配,但是,由于它们在不同的DB2变体(DB2/z、DB2/LUW、iSeries DB2等)上是不相同的,所以这几乎无关紧要)。

然后使用查询的结果来构造您的实际的查询:

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

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


如果,正如你在评论中提到的,你只想要18个"最高"的列(例如,如果列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

但是,在这种情况下,您可能希望将列称为col0001, col0145等,或者使排序能够处理可变宽度的数字。

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

这两个选项最多只能返回18行。


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

那么你的主表应该是这样的:

main_id         primary key
other_data

和辅助表类似于:

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

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

最新更新