总结两个非数字列

问题描述:

正在使用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找到电平值或者什么是最好的?

+2

如果您需要对关卡进行算术运算,则应该用数字格式存储数据。 – GurV

+2

为什么start_level和end_level字符串('L3'到'L12')而不是数字(3到12)?那么,如果他们是数字,你会知道如何解决这个问题吗?如果是这样,你知道如何将字符串'L12'转换为数字12吗?最后,“级别”栏的格式是什么 - 字母L后跟相关号码? – mathguy

+0

因此,如果start_level是L3并且end_level是L3,那么总级别是1? – miracle173

您可以使用regexp_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_levelend_level以字符串格式,它应该是一个整数,你应该在其前面放置L(即L3只是整数3。)我假设你现在不能重新设计你的数据库,所以试试看fo如下:

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.在这种情况下,它没有那么多,所以当它用完字符时它将停止。例如,如果您的级别为L12000000000,那么您将不得不增加该参数(我不认为情况如此)。之后,它使用CAST()将该字符串转换为整数格式。

现在您已准备好从您的CTE中进行选择。如图所示,查询非常简单。