计算两个不同表中两行之间的差异

时间:2015-06-17 11:47:32

标签: sql oracle oracle11g

我有两张表格,结构如下

表一

╔════╦═══════════╦═══════╦══╗
║ ID ║   Date    ║ value ║  ║
╠════╬═══════════╬═══════╬══╣
║  1 ║ 1/1/2015  ║   234 ║  ║
║  2 ║ 1/20/2015 ║   267 ║  ║
║  3 ║ 1/25/2015 ║   270 ║  ║
╚════╩═══════════╩═══════╩══╝

第二张表

╔════════════╦═══════════╗
║ start_date ║ end date  ║
╠════════════╬═══════════╣
║ 1/1/2015   ║ 1/20/2015 ║
║ 1/20/2015  ║ 1/25/2015 ║
╚════════════╩═══════════╝

我的输出必须是

╔════════════╦═══════════╦════════════╗
║ start_date ║ end date  ║ difference ║
╠════════════╬═══════════╬════════════╣
║ 1/1/2015   ║ 1/20/2015 ║         33 ║
║ 1/20/2015  ║ 1/25/2015 ║          3 ║
╚════════════╩═══════════╩════════════╝

所以这里我必须根据日期将第二个表连接到第一个表,然后计算列中两个值(对应于日期)之间的差异,然后在一个sql查询中显示它。

问题是我无法在一个查询中加入所有这些并将它们一起显示。

这就是我的目标

select start_date, end_date, ((SELECT
                    table_one.value
                FROM
                    table_one, 
                    table_two 
                WHERE 
                    table_one.date= table_two.end_date(+)
                ) - (
                SELECT
                    table_one.value
                FROM
                    table_one, 
                    table_two 
                WHERE 
                    table_one.date = table_two.start_date(+)
                ))from table_two,table_one where table_two.start_date(+)=table_one.date

我正在使用上述查询获得ORA-01427。我做错了什么,如何实现结果呢?

1 个答案:

答案 0 :(得分:6)

只需使用join s:

select t2.start_date, t2.end_date, (t1e.value - t1s.value) as difference
from table2 t2 join
     table1 t1s
     on t2.start_date = t1s.date join
     table1 t1e
     on t2.end_date = t1e.date;

如果table2中的某些日期可能与table1不匹配,请使用left join代替内部联接。