总结两个非数字列
问题描述:
正在使用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_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_level
和end_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中进行选择。如图所示,查询非常简单。
如果您需要对关卡进行算术运算,则应该用数字格式存储数据。 – GurV
为什么start_level和end_level字符串('L3'到'L12')而不是数字(3到12)?那么,如果他们是数字,你会知道如何解决这个问题吗?如果是这样,你知道如何将字符串'L12'转换为数字12吗?最后,“级别”栏的格式是什么 - 字母L后跟相关号码? – mathguy
因此,如果start_level是L3并且end_level是L3,那么总级别是1? – miracle173