2016-07-06 1 views
1

Si j'ai un champ CLOB qui contient plusieurs valeurs séparées par des virgules et que j'ai besoin de les totaliser pour obtenir une sortie finale, comment puis-je l'obtenir dans SQL Developer?Ajout de plusieurs valeurs dans une virgule séparée par une virgule

table Exemple:

STOCK | COST 

ABCDE | 258.40,299.50 
FGHIJ | 100.50,70.50,95.30 

Je voudrais être en mesure de sélectionner le total pour chaque ligne.

Pour ABCDE qui cherchent à sélectionner un total de 557,90

Pour FGHIJ la recherche pour sélectionner un total de 266,30

+0

Si vous connaissez 'SUM (coût) .. GROUPE BY' ... Il suffit d'utiliser celui-ci duplication Possible de [SQL Server split CSV en plusieurs lignes] (http://stackoverflow.com/questions/9811161/sql-server-split-csv-into-multiple-rows) –

+3

Stockage des valeurs au format CSV est très mauvaise conception de db. Vous devriez le changer – Jens

+0

@JuanCarlosOropeza Pensez-vous que la solution fonctionne également dans Oracle DB? – Jens

Répondre

0

Si vous avez Oracle 12, vous pouvez utiliser LATERAL:

select t.stock, sum(to_number(p.cst,'9999999.9999')) total 
from table_name t, 
lateral (select regexp_substr(t.cost,'[^,]+', 1, level) cst from dual 
      connect by regexp_substr(t.cost, '[^,]+', 1, level) is not null) p 
group by t.stock   

Dans le cas contraire:

select stock, sum(cst) total 
from (
     select stock,to_number(column_value,'9999999.9999') cst 
     from table_name t, xmltable(('"'|| REPLACE(t.cost, ',', '","')|| '"'))   
    ) p 
group by stock   
0

Voici une façon d'utiliser un CTE (Common Table Expression) avec une regex qui gère la liste des éléments NULL (ou les ignorer explicitement dans la requête, SUM les ignore en tout cas):

SQL> -- First build the base table. 
SQL> with tbl(stk, cst) as (
    select 'ABCDE', ',258.40,299.50'  from dual union 
    select 'FGHIJ', '100.50,70.50,,,95.30' from dual 
    ), 
    -- Turn the list into a table using the comma as the delimiter. Think of it 
    -- like a temp table in memory. This regex format handles NULL list elements. 
    example_tbl(stock, cost) as (
    select stk, regexp_substr(cst, '(.*?)(,|$)', 1, level, NULL, 1) 
    from tbl 
    connect by regexp_substr(cst, '(.*?)(,|$)', 1, level) is not null 
    group by stk, level, cst 
    ) 
    -- select * from example_tbl; 
    SELECT stock, to_char(sum(cost), '9990.99') Total 
    from example_tbl 
    group by stock; 

STOCK TOTAL 
----- -------- 
ABCDE 557.90 
FGHIJ 266.30 

SQL>