2013-04-08 24 views
0

我希望有人能帮助我。在Oracle中用逗号分隔的列中的计数或总计值SQL

我期待在excel中找到来自同一个字段的多个值的总数是否有可能?

我的样品列是:

0,0,1,1,1,2 

我想所有这些值在输出加在一起,总共有列

感谢

+0

哪一个是您的数据库? – TechDo 2013-04-08 10:54:57

+0

你想告诉你有2'0',3'''和'1''吗?如果是这样,我会用逗号分隔单元格并转置数据。然后,在记录上运行一个数据透视表。你问的这个问题很好。如果你愿意,我可以扩展更多关于如何做到这一点。 – Jerry 2013-04-08 10:57:56

+0

你好,谢谢你的反应,它不完全是我需要的,我希望从oracle数据库执行此操作并将其显示为字段。数字可以改变,所以我可以有一行0,0,1,1,1,2我想显示数字5,但下一行可能是1,1,2,6,10,所以我需要20来显示在总列 – 2013-04-08 11:08:36

回答

0

请尝试:

SET SERVEROUTPUT ON 
DECLARE 
    lv_formula VARCHAR2(1000):='0,0,1,1,1,2'; 
    result NUMBER; 
BEGIN 
    lv_formula:=replace(lv_formula, ',', '+'); 
    EXECUTE IMMEDIATE 'BEGIN :out := '||lv_formula||'; END;' USING OUT result; 
    DBMS_OUTPUT.PUT_LINE('Answer is...' || result); 
END; 
+0

嗨,谢谢你的反应,它不完全是我需要的,我期待从oracle数据库执行此操作并将其显示为字段。数字可以改变,所以我可以有一行0,0,1,1,1,2我想显示数字5,但下一行可能是1,1,2,6,10,所以我需要20来显示在总列 – 2013-04-08 11:01:40

+0

它是否适用于您的情况? – TechDo 2013-04-08 11:04:36

5
select 
    id, 
    list, 
    sum(regexp_substr(list, '\d+', 1, occ)) as total 
from 
    your_table, 
    (select level occ from dual connect by level < 2000) 
group by id, list 
order by 1 

fiddle

+0

好的作品。 +1 – TechDo 2013-04-08 11:32:58

0

大厦@ techdo的答案(和请给予好评或接受他的答案 - 我做的是充实了这一点),这里有一个办法做到这一点:

首先,建立实施@ techdo的功能代码:

CREATE OR REPLACE FUNCTION SUM_CSV(pin_Csv IN VARCHAR2) 
    RETURN NUMBER 
    DETERMINISTIC 
IS 
    strFormula VARCHAR2(1000); 
    nResult NUMBER; 
BEGIN 
    strFormula := REPLACE(pin_Csv, ',', '+'); 
    EXECUTE IMMEDIATE 'BEGIN :out := ' || strFormula || '; END;' USING OUT nResult; 
    RETURN nResult; 
END SUM_CSV; 

请注意,函数必须是确定性的 - 也就是说,对于给定的输入值,它总是会产生相同的结果。

然后创建含有调用函数SUM_CSV虚拟列的表:

CREATE TABLE csv_test 
    (text VARCHAR2(1000), 
    total NUMBER AS (SUM_CSV(text))); -- virtual column 

现在,插入到表:

INSERT INTO CSV_TEST(TEXT) VALUES('1,2,3,4,5'); 

提交插入,然后取这些值回:

SELECT * FROM CSV_TEST; 

而且你得到

TEXT   TOTAL 
1,2,3,4,5  15 

分享和享受。