繁体   English   中英

仅获取已分配的最新部门的SQL语句

[英]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标识符”}

调试错误screeenshot

在最新的开始日期(降序)之前订购它,然后选择排名前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

应该跳出两个语法问题:

  1. max(distinct agent_iddistinct也是多余的)之后,缺少右括号
  2. date文字缺少其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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM