2017-07-01 1 views
1

Ich habe diese Tabelle:Ich brauche eine Cursor/Funktion/Prozedur zu erstellen, um dieses Ergebnis zu erhalten

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

Und mit SQL bekomme ich dieses Ergebnis:

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

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

Ich brauche einen Cursor erstellen/function/procedure, die das gleiche Ergebnis wie die obige Tabelle haben wird. Natürlich sollte es anstelle einer Tabelle eine Zeichenkette wie diese sein "Mike hat 277 $ erhalten". Hat jemand eine Idee, wie es geht?

+0

Sie müssen schreiben, was Sie bisher versucht hatte. Nach Codes zu fragen, ist hier wirklich nicht erwünscht und ich hoffe, dass diejenigen, die Antworten posten, die Person, die die Anfrage posten, vom Lernen abhalten – XING

Antwort

0

Also speichert Ihre Tabelle tatsächlich 100$ in contractvalue? Das bedeutet, dass es sich um eine Zeichenfolge handelt, was ein sehr schlechtes Datenmodell ist. Wenn Sie Mathe machen müssen, benötigen Sie eine numerische Spalte: contractvalue_usd Speichern 100. Wenn Sie eine Zeichenkette haben, sind Sie auf Gedeih und Verderb, wenn Benutzer irgendeinen alten Müll in irgendeinem Format eingeben.

Wie auch immer, um Ihre eigentliche Frage zu adressieren. Es gibt verschiedene Wege, dies zu lösen. Hier ist eine, eine Funktion, die eine verschachtelte Tabelle formatierten Strings zurückgibt:

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; 
/ 

Run es wie folgt aus:

SQL> select * from table(get_contract_summary) 
    2/

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

SQL> 
Verwandte Themen