如何根据参数求x个表列?

sir*_*ain 2 sql t-sql loops sql-server-2012

假设我有budget13列的表 - accountperiod01通过period12.

如果我想创建一个存储过程,它将返回period01到periodX的总和(其中X作为参数传递),我将如何进行此操作?

在VBA中,我通过创建一个简单的字符串解析器来解决这个问题,该解析器将为我构建SQL命令.但是,我正在尝试删除该层,并在数据库级别的存储过程中执行此操作.有没有更好的方法来实现这一点,从字符串解析和CASE语句?

Gor*_*off 5

这就是为什么你不应该存储像这样的旋转列.如果每个"句点"列都在一个单独的行上,那么处理它会简单得多.

为了帮助您入门,这是一个执行您想要的查询:

select b.*, @x, running.periodsum
from budget b outer apply
     (select sum(v.period) as periodsum
      from (values (1, b.period1), (2, b.period2), . . . (12, b.period12)) v(n, period)
      where v.n <= @x
     ) running;
Run Code Online (Sandbox Code Playgroud)

而且您不必将其作为存储过程.您可以将其设置为用户定义的表函数.

  • 这是一个非常光滑的答案.我想的是一个"UNPIVOT",它有一些总和的分组,但我总是忘记`OUTER APPLY`和`FROM VALUES()`可以做一些很酷的事情. (2认同)