Sql 将两个非数字列相加的步骤

Sql 将两个非数字列相加的步骤,sql,oracle,aggregate-functions,Sql,Oracle,Aggregate Functions,我正在使用oracle 12c。我有4个专栏: country student_id (primary) start_level end_level ------- -------------------- ----------- --------- India I20 L3 L12 India I21 L5 L9 China

我正在使用oracle 12c。我有4个专栏:

country   student_id (primary)  start_level     end_level
-------   --------------------  -----------     ---------
India     I20                   L3              L12
India     I21                   L5              L9
China     c10                   L4              L11
USA       U20                   L2              L9
Canada    C20                   L9              L12
从上面的表格结构中,我想按国家和水平的总和对学生进行分组。例如,输出如下所示:

Country|  Total_students| Total_levels
India                  2            15
(总标高计算:L3至L12=10+L5至L9=5。因此,总标高为15)


我可以使用substr查找级别值或最佳值吗?

您可以使用
regexp\u substr()
提取数字:

select country,
       sum(cast(regexp_substr(end_level, '[0-9]+') as number) -
           cast(regexp_substr(start_level, '[0-9]+') as number) +
           1)

from t
group by country;
差不多

select   country, count(student_id) as total_students,
         sum(to_number(substr(end_level, 2)) - to_number(substr(start_level, 2)) + 1 )
                                    as total_levels
from     your_table
group by country
;

您不应该以字符串格式存储
start\u level
end\u level
,它应该是一个整数,您应该将
L
放在它前面(即
L3
变成整数
3
),但我假设此时无法重新设计数据库,请尝试以下操作:

WITH temp_table AS (
    SELECT country, 
           student_id,
           CAST(SUBSTR(start_level,2,10) AS INT) AS start_int,
           CAST(SUBSTR(end_level,2,10) AS INT) AS end_int
    FROM my_table)
SELECT COUNTRY, 
       COUNT(student_id) AS TOTAL_STUDENTS, 
       SUM(end_int - start_int + 1) AS Total_Levels
FROM temp_table
GROUP BY COUNTRY
ORDER BY COUNTRY
这使用一个公共表表达式(WITH子句)将表转换为整数格式的数字。
SUBSTR()
命令将从第二个数字开始,并转到下一个10。在本例中,它没有那么多字符,因此当字符用完时将停止。例如,如果您有level
L12000000000
,则必须增加该参数(我不希望出现这种情况)。然后,它使用
CAST()
将该字符串转换为整数格式


现在,您可以从CTE中进行选择。如图所示,查询非常直接。

如果需要对级别执行算术运算,则应以数字格式存储数据。为什么起始级别和结束级别字符串(“L3”到“L12”)而不是数字(3到12)?然后:如果它们是数字,你知道如何解决这个问题吗?如果是这样的话,你知道如何将像“L12”这样的字符串转换成数字12吗?最后,“级别”列的格式是什么?字母L后跟相关数字?因此,如果开始级别为L3,结束级别为L3,则总级别为1?