【问题标题】:How to do some aggregate calculation through several columns one by one?如何通过几列一一做一些聚合计算?
【发布时间】:2016-11-30 18:13:30
【问题描述】:

我是 SQL 新手,需要一些帮助。我有一个包含一些数值的表,我需要用表中其他列的计算填充一列(所有值都为空)。 例如。我有一些价值和总价值。我需要另一列来计算这两者之间的百分比。

我有很多列需​​要根据不同的列进行计算。例如。列名“risk1”将帮助我计算和填充另一个名为“1per”的列。我的代码如下所示:

UPDATE DPRA2_Export
    SET "1Per" = ((CAST(Risk1 AS DECIMAL (38,2))/CAST(GrandTotal AS DECIMAL(38,2))) * 100); 

UPDATE DPRA2_Export
    SET "2Per" = ((CAST(Risk2 AS DECIMAL (38,2))/CAST(GrandTotal AS DECIMAL(38,2))) * 100); 

UPDATE DPRA2_Export
    SET "3Per" = ((CAST(Risk3 AS DECIMAL (38,2))/CAST(GrandTotal AS DECIMAL(38,2))) * 100); 

..................

就这样继续下去。

有没有办法让我循环这个东西而不是一遍又一遍地写。代码中唯一改变的是列名“Risk%”和 SET 列名“%Per”

有什么想法吗?

【问题讨论】:

  • 桌子上有多少列?
  • 目前有5个,但会增加。如果可能的话,我想要一种动态的方式来做到这一点。
  • 老实说,在这几列中,编写动态内容比仅维护标准更新语句需要更长的时间。
  • 你想把它包装成自动运行的东西,还是生成更新语句,然后手动运行?
  • 列数将根据定期更新而增加。所以我真的希望代码更通用,而不是为每个创建的新列创建一行。将来它可能会自动运行。我正在为此努力。

标签: sql for-loop multiple-columns


【解决方案1】:

首先,列具有顺序名称 -- , , . . . ——可疑。一般来说,这种格式不适合关系数据库。相反,数据应该存储为每个风险一行和一个风险标识符。

此类表通常用于输出目的,但不适用于存储数据。

其次,除法的数据类型可能完全没有必要。如果您使用的是进行整数除法的数据库并且您的值是整数,则可以使用更简单的方法进行转换,例如 '*1.0'。

最后可以发单update

UPDATE DPRA2_Export
    SET "1Per" = Risk1*1.0 / GrandTotal,
        "2Per" = Risk2*1.0 / GrandTotal,
        "3Per" = Risk3*1.0 / GrandTotal ; 

您可以使用information_schema 表通过查询列来构建逻辑。

【讨论】:

  • 感谢您的提示!我仍然掌握 SQL
猜你喜欢
  • 2018-06-02
  • 2017-12-11
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2021-12-24
  • 1970-01-01
相关资源
最近更新 更多