[英]SQL statement that only fetches the newest department which has been allocated
在我的数据库中,我具有以下行和列: https : //i.imgur.com/ktUZY9d.jpg
我的问题是同一名员工有3个不同的部门,但他目前仅在1个部门中工作。我如何更改此SQL语句以仅包括其所在的最新部门,该部门始于2018年,结束于2100年,如ALLOCATION_START和ALLOCATION_END?
询问
string agentIdSubQuery = "SELECT DISTINCT " +
"AGENT_ID " +
"FROM " +
"KS_DRIFT.V_AGENT_ALLOCATION " +
"WHERE " +
"LENGTH(AGENT_INITIALS) < 5";
if(queryParams.SnapshotDate.HasValue)
agentIdSubQuery += " AND " + OracleConversion.ToOracleDate(queryParams.SnapshotDate) + " BETWEEN ALLOCATION_START AND ALLOCATION_END";
尝试了很多不同的解决方案,但是每次当我通过调试器运行时,它都会崩溃,在这种方法中,进一步的Down导致我崩溃:
string sql = "SELECT " +
"age1.* " +
"FROM " +
"KS_DRIFT.V_AGENT_ALLOCATION age1 " +
"INNER JOIN " +
"(" + agentIdSubQuery + ") age2 ON age1.AGENT_ID = age2.AGENT_ID " +
"ORDER BY " +
"AGENT_INITIALS";
{“在执行SQL查询期间发生错误:SELECT age1。* FROM KS_DRIFT.V_AGENT_ALLOCATION age1内部联接(SELECT max(SELECT最大值(DISPLAYCT AGENT_ID来自KS_DRIFT.V_AGENT_ALLOCATION WHERE LENGTH(AGENT_INITIALS))<5和'2018-08-15'在ALLOCATION_START之间和AND(UPPER(AGENT_INITIALS)='JKKA'))age2 ON age1.AGENT_ID = age2.AGENT_ID按AGENT_INITIALS排序。“}
还给了我一个内部异常:
{“ ORA-00904:\\” AGE2 \\“。\\” AGENT_ID \\“:ugyldig标识符”}
在最新的开始日期(降序)之前订购它,然后选择排名前1!
string agentIdSubQuery = "AGENT_ID " +
"FROM " +
"KS_DRIFT.V_AGENT_ALLOCATION " +
"WHERE " +
"LENGTH(AGENT_INITIALS) < 5 " +
" AND ROWNUM = 1 " +
" ORDER BY ALLOCATION_START DESC";
编辑,对于Oracle语法,将Top 1更改为Rownum = 1
表V_AGENT_ALLOCATION
包含每个业务代表的各个部门以及业务代表在那里工作的日期。 您需要代理的最后一个部门,这是Oracle的KEEP LAST
。 不过,您在桌上没有给我们提供太多信息。 假设该部门是由一个allocation_id
引用的:
select
agent_id,
max(id_allocation) keep (dense_rank last order by allocation_start)
as id_current_allocation
from v_agent_allocation
group by agent_id
order by agent_id;
您的错误消息显示最终生成的SQL:
{“执行SQL查询期间发生错误:SELECT age1。* FROM KS_DRIFT.V_AGENT_ALLOCATION age1内部联接(SELECT最大值(DISPLAYCT AGENT_ID来自KS_DRIFT.V_AGENT_ALLOCATION WHERE LENGTH(AGENT_INITIALS)<5和'2018-08-15'在ALLOCATION_START和之间AND(UPPER(AGENT_INITIALS)='JKKA'))age2 ON age1.AGENT_ID = age2.AGENT_ID按AGENT_INITIALS排序。“}
如果将其格式化以使其可读,则会得到:
select age1.*
from ks_drift.v_agent_allocation age1
inner join
( select max(distinct agent_id
from ks_drift.v_agent_allocation
where length(agent_initials) < 5
and '2018-08-15' between allocation_start and allocation_end
and (upper(agent_initials) = 'JKKA') ) age2
on age1.agent_id = age2.agent_id
order by agent_initials
应该跳出两个语法问题:
max(distinct agent_id
( distinct
也是多余的)之后,缺少右括号 date
关键字-它应该是date '2018-08-15'
(或date '2018-08-15'
是,一个绑定变量)。 (upper(agent_initials) = 'JKKA')
周围的括号是多余的,但也许它们是由您的生成器逻辑产生的,并且最容易保留。
不过,我不确定这与您的“最新分配部门”要求有何关系。 一些示例数据(而不是屏幕截图)会有所帮助。
如果您正在寻找当前部门,则应将分配日期与当前日期进行比较。
您的查询已经具有此WHERE
子句,因此对于所提供的示例来说应该可以正常工作。 但是,如果您想使用ROWNUM
特殊变量子句(假设它是Oracle)来指定只需要一行。
SELECT DISTINCT AGENT_ID
FROM KS_DRIFT.V_AGENT_ALLOCATION
WHERE LENGTH(AGENT_INITIALS) < 5
AND ALLOCATION_START < CURRENT_DATE AND CURRENT_DATE < ALLOCATION_END
AND ROWNUM = 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.