Excel不允许使用Oracle查询组功能

时间:2017-05-18 12:35:06

标签: sql excel oracle odbc

我正在制作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。这是我在这里的第一个问题,所以我希望它是好的:)

1 个答案:

答案 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'

祝你好运。