Sql 将两个非数字列相加的步骤
我正在使用oracle 12c。我有4个专栏: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
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。在本例中,它没有那么多字符,因此当字符用完时将停止。例如,如果您有levelL12000000000
,则必须增加该参数(我不希望出现这种情况)。然后,它使用CAST()
将该字符串转换为整数格式
现在,您可以从CTE中进行选择。如图所示,查询非常直接。如果需要对级别执行算术运算,则应以数字格式存储数据。为什么起始级别和结束级别字符串(“L3”到“L12”)而不是数字(3到12)?然后:如果它们是数字,你知道如何解决这个问题吗?如果是这样的话,你知道如何将像“L12”这样的字符串转换成数字12吗?最后,“级别”列的格式是什么?字母L后跟相关数字?因此,如果开始级别为L3,结束级别为L3,则总级别为1?