【问题标题】:Excel Oracle Query Group Function Not Allowed Here此处不允许使用 Excel Oracle 查询组功能
【发布时间】:2017-10-18 06:41:21
【问题描述】:

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

【问题讨论】:

    标签: sql excel oracle odbc


    【解决方案1】:

    “做最简单的事”——沃德·坎宁安

    我建议您在 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'
    

    祝你好运。

    【讨论】:

    • 谢谢鲍勃,但我担心向 EXCHG 表添加一列是不可能的。该表不受我的控制,并且基于不再更新的非常旧的系统。您还有其他建议吗?
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2020-03-11
    • 1970-01-01
    相关资源
    最近更新 更多