我需要创建一个游标/函数/过程来获得这个结果

时间:2017-07-01 15:14:11

标签: plsql cursor

我有这张桌子:

+----+-------+----------+---------------+
| ID | Name  | Contract | ContractValue |
+----+-------+----------+---------------+
| 1  | Mike  | 001      | 100$          |
+----+-------+----------+---------------+
| 1  | Mike  | 004      | 177$          |
+----+-------+----------+---------------+
| 2  | Diana | 002      | 300$          |
+----+-------+----------+---------------+
| 2  | Diana | 003      | 150$          |
+----+-------+----------+---------------+

使用SQL我得到了这个结果:

SELECT Name, SUM(ContractValue) as ContractValue
FROM table
GROUP BY Name;

+-------+---------------+
| Name  | ContractValue |
+-------+---------------+
| Mike  | 277$          |
+-------+---------------+
| Diana | 450$          |
+-------+---------------+

我需要创建一个与上表相同结果的游标/函数/过程。当然,它应该是一个像这样的字符串"迈克设法获得277 $"。有谁知道怎么做?

1 个答案:

答案 0 :(得分:0)

那么,您的表实际上将100$存储在contractvalue中?这意味着它是一个字符串,这是一个非常糟糕的数据模型。如果您必须对其进行数学运算,则需要一个数字列:contractvalue_usd存储100。拥有一个字符串意味着您可以用任何格式输入任何旧垃圾的用户摆布。

无论如何,要解决你的实际问题。有各种不同的解决方法。这是一个函数,它返回一个嵌套的格式化字符串表:

create or replace function get_contract_summary 
    return sys.dbms_debug_vc2coll
as
    return_value sys.dbms_debug_vc2coll;
begin
    select name || ' managed to obtain ' 
                || to_char( total_contractvalue ) ||'$'
    bulk collect into return_value
    from (  
        select name, 
               sum(to_number(replace(contractvalue, '$'))) as total_contractvalue
        from contracts
        group by name
        );
    return return_value;
end get_contract_summary;
/   

像这样运行:

SQL> select * from table(get_contract_summary)
  2  /

COLUMN_VALUE
--------------------------------------------------------------------------------
Diana managed to obtain 450$
Mike managed to obtain 277$

SQL>