Excel的Oracle查询组function不允许在这里

我正在做一个Excel的Oracle查询来实现以下。

我有两张桌子,一张桌子上有订单,另外一张桌子上有汇率,从哪个date开始适用:

工作表:

ID INVOICE_DATE 1 05-05-2017 2 05-03-2017 3 04-28-2017 4 04-15-2017 5 04-01-2017 6 03-28-2017 7 03-15-2017 8 03-02-2017 9 02-27-2017 

表EXCHG:

 CURR RATE DATE_FROM USD 0.92 05-01-2017 GBP 1.21 05-01-2017 USD 0.95 04-04-2017 GBP 1.18 04-04-2017 USD 0.94 04-01-2017 GBP 1.19 04-01-2017 USD 0.91 03-03-2017 GBP 1.17 03-03-2017 USD 0.92 03-01-2017 GBP 1.20 03-01-2017 USD 0.93 02-01-2017 GBP 1.21 02-01-2017 

我想获得发票date和当时适用汇率的订单。

目前我有以下SQL查询:

 SELECT JOBS.ID, JOBS.INVOICE_DATE, EXCHG.CURR, EXCHG.RATE, EXCHG.DATE_FROM FROM LOC.JOBS JOBS LEFT JOIN LOC.EXCHG EXCHG ON (JOBS.INVOICE_DATE-EXCHG.DATE_FROM) >= 0) AND (JOBS.INVOICE_DATE-EXCHG.DATE_FROM <= 31) WHERE EXCHG.CURR = 'USD' 

而且这个工作正常,除了我得到一些两倍或两倍以上的订单:

 ID INVOICE_DATE RATE_USD DATE_FROM 1 5/5/2017 0.92 5/1/2017 1 5/5/2017 0.95 4/4/2017 2 5/3/2017 0.92 5/1/2017 2 5/3/2017 0.95 4/4/2017 3 4/28/2017 0.95 4/4/2017 3 4/28/2017 0.94 4/1/2017 4 4/15/2017 0.95 4/4/2017 4 4/15/2017 0.94 4/1/2017 5 4/1/2017 0.94 4/1/2017 5 4/1/2017 0.91 3/3/2017 5 4/1/2017 0.92 3/1/2017 6 3/28/2017 0.91 3/3/2017 6 3/28/2017 0.92 3/1/2017 7 3/15/2017 0.91 3/3/2017 7 3/15/2017 0.92 3/1/2017 8 3/2/2017 0.92 3/1/2017 8 3/2/2017 0.93 2/1/2017 9 2/27/2017 0.93 2/1/2017 

我想得到的是:

 ID INVOICE_DATE RATE_USD DATE_FROM 1 5/5/2017 0.92 5/1/2017 2 5/3/2017 0.92 5/1/2017 3 4/28/2017 0.95 4/4/2017 4 4/15/2017 0.95 4/4/2017 5 4/1/2017 0.94 4/1/2017 6 3/28/2017 0.91 3/3/2017 7 3/15/2017 0.91 3/3/2017 8 3/2/2017 0.92 3/1/2017 9 2/27/2017 0.93 2/1/2017 

我想弄清楚如何做到这一点,我需要select这两个语句的最小结果:

 JOBS.INVOICE_DATE-EXCHG.DATE_FROM >= 0 AND JOBS.INVOICE_DATE-EXCHG.DATE_FROM <= 31 

我能想到的最好的是:

 SELECT JOBS.ID, JOBS.INVOICE_DATE, EXCHG.CURR, EXCHG.RATE, EXCHG.DATE_FROM FROM LOC.JOBS JOBS LEFT JOIN LOC.EXCHG EXCHG ON (MIN(JOBS.INVOICE_DATE-EXCHG.DATE_FROM) AND (JOBS.INVOICE_DATE-EXCHG.DATE_FROM >= 0)) WHERE EXCHG.CURR = 'USD' 

但是这给了我以下错误:[Oracle] [ODBC] [Ora] ORA-00934:组function不允许在这里

有人可以帮我解决这个问题吗? 我会很开心。

弗洛里斯

PS。 这是我的第一个问题,所以我希望它是好的:)

“做最简单的事情可能有用” – 坎宁安病房

我build议您在名为DATE_TO的EXCHG表中添加另一列,表示汇率的到期date。 无论何时您获得特定货币的新汇率,都可以在任何与货币匹配的行上设置DATE_TO,并且DATE_TO = NULL,这可以使用复合触发器来完成。 然后你的查询变成:

 SELECT j.ID, j.INVOICE_DATE, e.CURR, e.RATE, e.DATE_FROM FROM LOC.JOBS j LEFT OUTER JOIN LOC.EXCHG e ON (j.INVOICE_DATE BETWEEN e.DATE_FROM AND e.DATE_TO) OR (e.DATE_FROM <= j.INVOICE_DATE AND e.DATE_TO IS NULL) WHERE e.CURR = 'USD' 

祝你好运。