Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新表中的列_Sql_Oracle_Plsql_Oracle11g - Fatal编程技术网

Sql 更新表中的列

Sql 更新表中的列,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,我有一个要求,其中有一个如下表 Invoice Date Year Amount 1001 04-NOV-15 2015 100 1001 04-NOV-16 2016 400 1001 04-NOV-17 2017 600 1002 01-OCT-17 2014 1000 我希望在结尾有一个专栏,可以计算出时尚中的差异 Invoice Date Year Amount Calcula

我有一个要求,其中有一个如下表

Invoice Date        Year    Amount
1001    04-NOV-15   2015    100
1001    04-NOV-16   2016    400
1001    04-NOV-17   2017    600
1002    01-OCT-17   2014    1000
我希望在结尾有一个专栏,可以计算出时尚中的差异

Invoice Date        Year    Amount    Calculation
1001    04-NOV-15   2015    100       0
1001    04-NOV-16   2016    400       ((04-NOV-16)-(04-NOV-15))/(400-300)
1001    04-NOV-17   2017    600       ((04-NOV-17)-(04-NOV-16))/(600-400)
1002    01-OCT-14   2014    1000      0
1002    01-OCT-18   2018    2000      ((01-OCT-18)-(01-OCT-14))/(2000-1000)
1003    01-JAN-14   2014    1000      0
计算列是必需的,并且

我尝试了下面的查询,得到了金额差异

select invoice, 
       date_value,
       Year_va,
       amount,
       amount-lag(amount) over (partition by invoice

                                                order by date_value,invoice
                                               ) diff                                      
 from sample;
当我试过

select invoice, 
       date_value,
       Year_va,
       amount,
       MOD(date_value-lag(date_value),amount-lag(amount)) over (partition by invoice

                                                order by date_value,invoice
                                               ) diff                                      
 from sample;
它因窗口函数错误而失败


有人能帮上忙吗?…

如果你想要区别,为什么要使用
mod()


您可能需要一个
coalesce()
来获得
0
s,而不是
NULL
s(您的查询无法处理此问题,但您的示例数据表明您可能需要这样做)。

如果您想要差异,为什么要使用
mod()


您可能需要一个
coalesce()
来获得
0
s,而不是
NULL
s(您的查询无法处理此问题,但您的示例数据表明您可能需要这样做)。

正如Gordon所指出的,您可以使用
lag
函数和
coalesce
来获得所需的结果,如下所示

SELECT t1.*
    ,coalesce((
            date_value - lag(date_value) OVER (
                PARTITION BY invoice ORDER BY date_value
                )
            ) / (
            amount - lag(amount) OVER (
                PARTITION BY invoice ORDER BY date_value
                )
            ), 0) AS ratio
FROM table1 t1;
您还可以使用
ANSI
等效项,即
min/max
以及前面1行和前面1行之间的
行,如下所示

SELECT t1.*
    ,coalesce((
            date_value - min(date_value) OVER (
                PARTITION BY invoice ORDER BY date_value ROWS BETWEEN 1 PRECEDING
                        AND 1 PRECEDING
                )
            ) / (
            amount - min(amount) OVER (
                PARTITION BY invoice ORDER BY date_value ROWS BETWEEN 1 PRECEDING
                        AND 1 PRECEDING
                )
            ), 0) AS ratio
FROM table1 t1;
结果:

INVOICE      DATE_VALUE             YEAR    AMOUNT  RATIO
-----------------------------------------------------------
1001         04.11.2015 00:00:00    2015    100     0
1001         04.11.2016 00:00:00    2016    400     1.22
1001         04.11.2017 00:00:00    2017    600     1.8250
1002         01.10.2017 00:00:00    2014    1000    0

正如Gordon所指出的,您可以使用
滞后
函数和
合并
,如下所示,以获得所需的结果

SELECT t1.*
    ,coalesce((
            date_value - lag(date_value) OVER (
                PARTITION BY invoice ORDER BY date_value
                )
            ) / (
            amount - lag(amount) OVER (
                PARTITION BY invoice ORDER BY date_value
                )
            ), 0) AS ratio
FROM table1 t1;
您还可以使用
ANSI
等效项,即
min/max
以及前面1行和前面1行之间的
行,如下所示

SELECT t1.*
    ,coalesce((
            date_value - min(date_value) OVER (
                PARTITION BY invoice ORDER BY date_value ROWS BETWEEN 1 PRECEDING
                        AND 1 PRECEDING
                )
            ) / (
            amount - min(amount) OVER (
                PARTITION BY invoice ORDER BY date_value ROWS BETWEEN 1 PRECEDING
                        AND 1 PRECEDING
                )
            ), 0) AS ratio
FROM table1 t1;
结果:

INVOICE      DATE_VALUE             YEAR    AMOUNT  RATIO
-----------------------------------------------------------
1001         04.11.2015 00:00:00    2015    100     0
1001         04.11.2016 00:00:00    2016    400     1.22
1001         04.11.2017 00:00:00    2017    600     1.8250
1002         01.10.2017 00:00:00    2014    1000    0

我没有使用coalesce()。你能帮我回答整个问题吗。我使用的是oracle sql developer您可以研究一下这个问题吗?我没有使用coalesce()。你能帮我回答整个问题吗。我正在使用oracle sql developer您可以研究这个问题吗?您可以在这里帮助我回答这个问题吗