我正在制作Excel Oracle Query以实现以下目标。
我有两张桌子,一张包含订单的表格和开具发票的表格,以及一张包含汇率的表格,以及该汇率适用的日期:
表格工作:
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
我希望在当时获得包含发票日期和适用汇率的订单。
目前我有以下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
我试图找出如何做到这一点,不知怎的,我需要选择这两个语句的最小结果:
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:此处不允许使用组功能
有人可以帮我解决这个问题吗?我真的很开心。
弗洛
PS。这是我在这里的第一个问题,所以我希望它是好的:)
答案 0 :(得分:0)
“尽可能做最简单的事情” - Ward Cunningham
我建议您在EXCHG表中添加另一个名为DATE_TO的列,该列表示汇率的到期日期。无论何时获得特定货币的新汇率,您都可以在与货币匹配的任何行上设置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'
祝你好运。