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
但是,在这种情况下,您可能希望调用列 col0001
、col0145
等等,或者使排序能够处理可变宽度的数字。
尽管获取所有列可能更容易(如果您不能更改列名)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 的相对简单的连接。
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
但是,在这种情况下,您可能希望调用列 col0001
、col0145
等等,或者使排序能够处理可变宽度的数字。
尽管获取所有列可能更容易(如果您不能更改列名)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 的相对简单的连接。