我有一个列显示了我们公司所经历的项目的标题,另一列显示了每个项目的工作时间。
项目标题包含关键字,关键字由“关键字:”格式定义,即“ETL:”
有些项目有多个关键字,即'Client:ETL:ASCX:'
例如,项目标题可以是'客户:ETL:ASCX:更新导入过程'
我不提前知道关键字。
我想要给定关键字的总小时数和项目数 因此,让我们使用以下两个项目标题作为示例:
报告应该给出:
Keyword - Total Projects - Total Hours
Client: - 2 -30
ETL: - 2 - 30
ASCX: - 1 - 20
Bridge: - 1 - 10
获取关键字的第一个实例很简单 - 只需子串;但是找到嵌套关键字证明是困难的。
嵌套搜索可以在SQL中完成吗?
任何参赛者?
更新(最初发布为“答案”):
进一步的例子:
假设我有以下项目标题的两条记录:
Record 1: Interface: ETL:
Record 2: ETL:
记录1有10个小时,记录2有30个小时。
现在,我的代码捕获了第一个关键字实例,所以我现在的输出是(关键字:小时)
ETL: 30
Interface: 10
但是,要求是显示ETL已分配40小时,因为两个项目将ETL作为关键字:
ETL: 40
Interface: 10
当然,我可以使用LIKE来查找ETL或Interface的所有实例,但我需要在select each关键字中分解。在上面的示例中,如果我使用类似'%ETL:%'的话,我会得到两个记录,但我希望查看所有关键字的所有小时数,按关键字细分。
也许更好的问题是:
如何获得如下所示的记录:
Interface: ETL:
进入如下所示的输出:
Interface:
ETL:
在sql中?
答案 0 :(得分:1)
不是很漂亮,但您可以使用MODEL
子句进行拆分(只有一种方式)。假设您通过ID字段分别拥有project
和project_hours
个表:
create table projects as (
select 'Client: ETL: ASCX: update the import process' as project_title,
1 as project_id from dual
union all select 'Client: ETL: Bridge: something else', 2 from dual
--union all select 'Interface: ETL:', 3 from dual
--union all select 'ETL:', 4 from dual
)
/
create table project_hours as (
select 1 as project_id, 20 as hours from dual
union all select 2, 10 from dual
--union all select 3, 10 from dual
--union all select 4, 30 from dual
)
/
此:
with tmp_tab as (
select project_id, trim(t) as keyword, i
from projects
model
return updated rows
partition by (project_id)
dimension by (0 i)
measures (project_title t)
rules (t[for i from 1 to
(length(regexp_replace(':' || t[0],'[^:]')) - 1) increment 1]
= regexp_substr(t[0],'[^:]+',1,cv(i)))
order by project_id, i
)
select tt.keyword,
count(distinct tt.project_id) as total_projects,
sum(h.hours) as total_hours
from tmp_tab tt
left join project_hours h on h.project_id = tt.project_id
group by tt.keyword
/
给出这个:
KEYWORD TOTAL_PROJECTS TOTAL_HOURS
-------------------------------- ------------------ ------------------
Bridge 1 10
ETL 2 30
Client 2 30
ASCX 1 20
修改或者,如果包含第二组示例,则提供:
KEYWORD TOTAL_PROJECTS TOTAL_HOURS
-------------------------------- ------------------ ------------------
ETL 4 70
Bridge 1 10
Interface 1 10
Client 2 30
ASCX 1 20
根据答案here改编 - 所以任何赠送都应该真正转到Rob van Wijk。
我假设关键字后面总是跟冒号,最后一个冒号之后的任何内容都不应该被视为关键字,只需要在length()
中添加-1。
答案 1 :(得分:0)
select count(*) as projectcount, sum(hours) as totalhours from projects WHERE title like '%mykeyword:%';