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

时间:2015-10-09 00:28:21

标签: sql db2 sas

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

问题 - 是否存在与此类似的DB2 / SQL?我有50列(它们被命名为col1,col2,col3 .... col50,我需要找到它们的总和。 即:

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

1 个答案:

答案 0 :(得分:5)

不,至少据我所知,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位已根据上一个查询构建。

如果你在评论中提到,你只想要十八个“最高”列(例如,如果列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之后的(不是字符串)值,并且在构造第二个查询时丢弃除了最后十八个之外的所有值。)

这两个选项最多只返回十八行。

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

所以你的主表将是这样的:

main_id         primary key
other_data

和你的辅助表类似于:

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

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