oracle sql与员工一起选择
我有一个有趣的问题,无法解决。请帮忙 它们是桌子oracle sql与员工一起选择,sql,database,oracle,function,Sql,Database,Oracle,Function,我有一个有趣的问题,无法解决。请帮忙 它们是桌子 t_employee ID NUMBER, DEPARTMENT_ID NUMBER, CHIEF_ID NUMBER, NAME VARCHAR2(100 BYTE), SALARY NUMBER, BIRTH_DATE DATE, ADDRESS VARCHAR2(200 BYTE), STATUS
t_employee
ID NUMBER,
DEPARTMENT_ID NUMBER,
CHIEF_ID NUMBER,
NAME VARCHAR2(100 BYTE),
SALARY NUMBER,
BIRTH_DATE DATE,
ADDRESS VARCHAR2(200 BYTE),
STATUS VARCHAR2(1 BYTE)
及
需要在“地址”列中显示每个地区的员工人数(如果他们现在是地区,则为“否”区域)。
已转换为大写的区域名称
问题是什么?问题是Address collumn具有非结构化数据,例如:
地址:
所以区域必须在第一个(,)和第二个(,)之间,并且必须包含单词(reg)
例如:
Russia(Country), reg Moskovskay , Moscow(city), Lenina, (street) .... or
Russia(Country), Moskovskay reg , Moscow(city), Lenina, (street) .... or
分隔符为(,)
排名第二
非常感谢 开始时,请查看并更改数据库设计以分隔这些字段。从长远来看,这将对您有所帮助。如果您仍希望坚持此结构,则可以在插入数据时以所需格式管理数据。希望有帮助 试试下面的方法:
SELECT regexp_substr(address, ',(.*?reg.*?),', 1, 1, null, 1) AS region, COUNT(*)
FROM t_employee
GROUP BY regexp_substr(address, ',(.*?reg.*?),', 1, 1, null, 1);
不过,我强烈建议您在加载表之前或期间重构模式,并将地址拆分为街道、城市、地区等单独的字段,如果您有可能的话。自由格式字符串在数据库中很少是一个好主意,此查询将无法使用索引,这很可能使其执行速度较慢
WITH a AS ( SELECT TRIM(
REPLACE(
UPPER(
REGEXP_SUBSTR(ADDRESS, ',([^,]*),', 1, 1, 'i', 1)
),
' REG ', ''
)
) REGION
FROM t_employee)
SELECT REGION, COUNT(*) cnt FROM a GROUP BY REGION
.主题外,但表设计不好…您的预期输出是什么?你能把它做成表格吗?一个非常全面的答案+1这个答案还用少量的代码给出了所需的解决方案。思考是非常困难的!
SELECT regexp_substr(address, ',(.*?reg.*?),', 1, 1, null, 1) AS region, COUNT(*)
FROM t_employee
GROUP BY regexp_substr(address, ',(.*?reg.*?),', 1, 1, null, 1);
WITH a AS ( SELECT TRIM(
REPLACE(
UPPER(
REGEXP_SUBSTR(ADDRESS, ',([^,]*),', 1, 1, 'i', 1)
),
' REG ', ''
)
) REGION
FROM t_employee)
SELECT REGION, COUNT(*) cnt FROM a GROUP BY REGION
WITH t_employee AS (
SELECT 1 AS id, 10 AS department_id, 'a' AS name, 'kws, aaa reg, skdir, 23049' AS address FROM dual
UNION ALL SELECT 2, 10, 'b', 'slkx, aaa reg, lskdj, 902349' FROM dual
UNION ALL SELECT 3, 20, 'c', 'lskj, bbb reg, lskdi, 489308' FROM dual
UNION ALL SELECT 4, 10, 'd', 'lskj, aaa reg, lskdi, 489308' FROM dual
UNION ALL SELECT 5, 20, 'e', 'lskj, ccc reg, lskdi, 489308' FROM dual
UNION ALL SELECT 6, 30, 'f', 'lskj, bbb reg, lskdi, 489308' FROM dual
)
, t_region AS (
SELECT id,
TRIM (
REPLACE (
SUBSTR (address,
INSTR (address, ',', 1) + 1,
INSTR (address, ',', INSTR(address, ',', 1) + 1)
- INSTR(address, ',', 1) - 1),
'reg',
'')
)
AS region
FROM t_employee e
)
SELECT r.region, count(*) AS employees
FROM t_region r
GROUP BY r.region
;