我有三张桌子
orders.orderid (and other non-pertinent stuff)
payment.orderid
payment.transactiondate
payment.amount
projectedpayment.orderid
projectedpayment.projecteddate
projectedpayment.projectedamount
本质上,
payment
表示收到实际付款的时间;projectedpayment
表示系统认为应该收到付款的时间。我需要建立一个查询来比较投影和实际。我想查询它们,以便查询中的每一行都有orderid,payment.transactiondate,payment.amount,projectedpayment.projecteddate,projectedpayment.projectedamount,payment和projectedpayment中的行按各自的日期排序。例如。,
orderid transactiondate amount projecteddate projectedamount
1 2015-01-01 12.34 2015-01-03 12.34
1 2015-01-15 12.34 2015-01-15 12.44
1 null null 2015-02-01 12.34
2 2014-12-31 50.00 null null
因此,按顺序细分,实际和预计付款是什么,其中可能有比实际更多的预计付款,或比预计更多的实际付款,按日期对齐(只需对两者进行排序,没有比这更复杂的了)。
似乎我应该可以用
left join
从orders
到其他两个用union
排序的表的某种order by
来实现这一点,但是我还不能使它工作,所以它可能是完全不同的。我知道我不能将order
、payment
和projectedpayment
三个表全部连接起来,否则我将得到后两个表的叉积。我碰巧使用的是
postgresql
9.4,但希望我们不需要太具体的数据库。 最佳答案
我不知道postgres对不起:(但如果你知道如何做分区行号这样的工作应该。
select
coalesce(a.orderid,b.orderid) as orderid
,transactiondate
,amount
,projecteddate
,projectedamount
FROM
(select
orderid
,ransactiondate
,amount
,row_number() over (partition by orderid order by orderid,transactiondate) as rn
from payment) as a
full join
(select
orderid
,projecteddate
,projectedamount
,row_number() over (partition by orderid order by orderid,projecteddate) as rn
from projectedpayment) as b
on a.orderid= b.orderid
and a.rn = b.rn
*这是sqlserver语法(2K5+AFAIK)
这里的逻辑是,您需要为每个预测付款和实际付款分配一个唯一的数字,这样您就可以将两个表连接在一起,但只有每一行与另一个表中的一行匹配。
如果您每天只有一次付款,那么您可以在订单ID和日期上进行完全连接,而不必担心行号。
完全连接允许两边都有空,因此需要合并orderid
*同样,这也不会显示没有付款或预测的订单。。如果这是一个问题,请发表评论。