我有三张桌子

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 joinorders到其他两个用union排序的表的某种order by来实现这一点,但是我还不能使它工作,所以它可能是完全不同的。我知道我不能将orderpaymentprojectedpayment三个表全部连接起来,否则我将得到后两个表的叉积。
我碰巧使用的是postgresql9.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
*同样,这也不会显示没有付款或预测的订单。。如果这是一个问题,请发表评论。

10-07 18:39