SAS有一个(col1-coln)函数的总和,它找到col1,col2,col3 ... coln中所有值的总和.(即,您不必列出所有列名称,只要它们连续编号).这是查找几个(适当命名的)变量之和的便捷捷径.
问题 - 是否存在与此类似的DB2/SQL?我有50列(它们被命名为col1,col2,col3 .... col50,我需要找到它们的总和.即:
select sum(col1, col2, col3,....,col50) AggregateSum
from foo.table
Run Code Online (Sandbox Code Playgroud)
不,至少据我所知,DB2没有这样的野兽.但是,您可以通过首先查询数据库元数据以提取给定表的列来动态创建此类查询.
从内存中,DB2有一个sysibm.syscolumns表,它基本上包含可用于动态构造查询的列信息.
您将首先使用如下查询:
select column for sysibm.syscolumns
where schema = 'foo' and tablename = 'table'
and column like 'col%'
Run Code Online (Sandbox Code Playgroud)
(列名可能不完全匹配,但是因为它们在DB2的不同变体(DB2/z,DB2/LUW,iSeries DB2等)上不一样,这几乎不重要.
然后使用的结果是查询来构建你的实际查询:
select col1+col2+...+colN AggregateSum from foo.table
Run Code Online (Sandbox Code Playgroud)
该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
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,您可能希望调用列col0001,col0145依此类推,或使排序能够处理可变宽度数.
虽然可能更容易(如果你不能更改列名)来获取所有列colNNN,col但是在构造第二个查询之后,通过数字(非字符串)值自己对它们进行排序,并丢弃除最后十八个之外的所有列) .
这两个选项最多只能返回18行.
但是在这种情况下,您可能还想考虑将可变数据移动到另一个表,如果在您的情况下可能的话.如果你曾经发现自己维护表内的阵列,它通常是更好地分离了这一点.
所以你的主表将是这样的:
main_id primary key
other_data
Run Code Online (Sandbox Code Playgroud)
你的辅助表类似于:
main_id foreign key to main(main_id)
sequence_nm
other_data
primary key (main_id, sequence_num)
Run Code Online (Sandbox Code Playgroud)
这将允许您在需要时拥有稀疏数据,并且还可以添加数据而无需更改主表的架构.获取最新十八个结果的查询会稍微复杂一点,但仍然是两个表的相对简单的连接.