【问题标题】:How to sum all values in a column excluding string values in Oracle?如何对列中的所有值求和,不包括 Oracle 中的字符串值?
【发布时间】:2021-07-27 05:16:36
【问题描述】:

我有一张表,我想做两个字段的总和。但是,由于列中有不同的数据类型,因此在尝试对值求和时会导致错误。 我正在寻找一种将所有数值添加到列中的方法,不包括非数值。

这是我的桌子:

id | value | stock
1,    -    ,45
1,    30    ,45
2,    -    ,-
2,    30    ,-
2,    -    ,-
3,    400, 55
3,    400, 60
4,    404,  55

这是我希望输出的样子:

id | value_total | stock_total
1,      30,             45
2,     30,              -
3,     800,            115
4,     404,            45

这是我的代码:

    SELECT id, SUM(NVL(value_total,0)) AS volume_total, 
SUM(NVL(stock_total,0)) AS stock_total
FROM table1 
group by id

我收到此错误:

ORA-01722: invalid number
01722. 00000 -  "invalid number"
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.

我的假设是错误来自列中的“-”值。在字段中添加所有数值但排除“-”值的任何提示或建议?

【问题讨论】:

  • 首先,我假设您的实际数据没有逗号。其次,鉴于您发布的示例数据,为什么id 1 的stock_total 是45 而不是90?源表中有 2 行,id 为 1,stock 为 45。第三,为什么要在源表中声明 stockvalue,显然,varchar2 而不是 @ 987654332@?使用正确的数据类型将为您省去一个痛苦的世界。
  • @mail_the 。 . .您真的在使用不受支持的 Oracle 版本吗?

标签: sql oracle oracle11g case


【解决方案1】:

您可以尝试使用CASE 表达式和regexp_like() 仅将表示数字(十进制表示法)的字符串传递给to_number(),否则返回0。大致如下:

SELECT sum(CASE
             WHEN regexp_like(value_total,
                              '^(\+|-)?[0-9]*((.)?[0-9])[0-9]*$') THEN
               to_number(value_total)
             ELSE
               0
           END) value_total
       FROM table1;

但理想情况下,您修复架构并为列使用适当的数据类型,即一些 number 变体。

【讨论】:

    【解决方案2】:

    to_number()on conversion error 一起使用:

    SELECT id,
           SUM(TO_NUMBER(value_total DEFAULT 0 ON CONVERSION ERROR) AS volume_total, 
           SUM(TO_NUMBER(stock_total DEFAULT 0 ON CONVERSION ERROR) AS stock_total
    FROM table1 
    GROUP BY id;
    

    【讨论】:

    • 该问题已标记为 Oracle 11g。如果这实际上是正在使用的版本,则 on conversion errorto_number 的增强不可用。在最近的版本中,这将是要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多