2015-11-09 47 views
2

我一直在尝试各种方式来获取我需要的格式的数据,但无济于事。我需要合并3个表格,显示1个表格中的所有内容,并添加一个显示表格2中RECENT最大值的额外列,但要考虑表3中的条件。显示表格将更有意义... I'我简化了表格。因此,这里的工作单表:如何在基于条件的SQL中获取最新值

workorderid wonum siteid 
1000 5000 SITE1 
1001 5001 SITE1 
1002 5002 SITE1 
1003 5003 SITE1 
1004 5000 SITE2 
1005 5001 SITE2 
1006 5002 SITE2 
1007 5004 SITE1 

我需要使用wonum和SITEID得到pay_value - 但可以有每个工作秩序多次付款。我需要获得付款尚未取消的最新付款。不幸的是,这是在purchase_req表中保存的。这是payment_wos表

wonum_ref siteid pay_numref pay_value 
5000 SITE1 12345 1000.00 
5001 SITE1 12345 1023.52 
5002 SITE1 12346 52.32 
5003 SITE1 12347 452.12 
5000 SITE2 12348 154.21 
5000 SITE1 12347 852.25 
5001 SITE2 12350 953.86 
5002 SITE2 12349 587.78 

purchase_req表:

pay_num siteid status sent_date 
12345 SITE1 CANCEL 2015-11-02 15:00 
12346 SITE1 SENT 2015-11-03 13:00 
12347 SITE1 SENT 2015-11-04 12:00 
12348 SITE2 APPROVED 2015-11-04 15:00 
12349 SITE2 CANCEL 2015-11-05 11:00 
12350 SITE2 SENT 2015-11-06 15:00 

因此,对于所示的例子中的数据,我需要得到下面的结果:

workorderid wonum siteid pay_value 
1000 5000 SITE1 852.25 
1001 5001 SITE1 NULL 
1002 5002 SITE1 52.32 
1003 5003 SITE1 452.12 
1004 5000 SITE2 154.12 
1005 5001 SITE2 953.86 
1006 5002 SITE2 NULL 
1007 5004 SITE1 NULL 

因此,例如workorderid 1001显示pay_value为NULL,因为最近的付款状态为'取消'。 也例如workorderid 1007显示pay_value为NULL以及没有付款。 下面的尝试只显示付款的工单。如果我调整where子句,以便 pr.status不在('CANCEL') 它表示 (pr.status不在('CANCEL')或pr.status为空) 然后这显示所有工作订单每个付款都处于“取消”状态的帐户除外。我需要它来显示每一个工单:S。 任何帮助将不胜感激。 SQL低于:

;with 
Pay_Per_WO 
AS 
(
select w.workorderid, w.wonum, p.wonumref, w.siteid as wsiteid, p.siteid as psiteid, p.pay_numref, p.pay_value, w.siteid, pr.sent_date, pr.status, pr.siteid as prsiteid, pr.pay_num 
,ROW_NUMBER() OVER(PARTITION BY w.workorderid order by MAX(pr.sent_date) Desc) payorder 
from workorder w 
left join payment_wos p 
on w.wonum = p.wonumref and w.siteid = p.siteid 
left join pr 
on p.pay_numref = pr.pay_num and p.siteid = pr.siteid 
where 
pr.status not in ('CANCEL') 
group by w.workorderid, w.wonum, p.wonumref, w.siteid, p.siteid, p.pay_numref, p.pay_value, w.siteid, pr.sent_date, pr.status, pr.siteid, pr.pay_num 
) 

, 
Pay_Calc 
AS 
(
Select 
a.workorderid, a.wonum, a.siteid, a.pay_value 
from Pay_Per_WO a 
WHERE a.payorder = 1 
group by a.workorderid, a.wonum, a.siteid, a.pay_value 
) 

select * from Pay_Calc 
+0

请标记与您正在使用的数据库你的问题。 –

回答

0

我无法测试它作为我没有你的表,但应该是这样的:

with q1 as 
(select * from 
    (select 
    pw.wonum_ref, 
    pw.site_id, 
    pw.pay_value, 
    rank() over (partition by pw.pay_num,pw.site_id order by pr.sent_date desc) rnk 
    from payment_wos pw 
    left outer join purchase_req pr on pw.pay_num = pr.pay_num and pw.site_id = pr.site_id 
    where pr.status != 'CANCEL') 
where rnk = 1) 
select 
    wo.workorderid, 
    q1.wonum_ref, 
    q1.site_id, 
    q1.pay_value 
from workorder wo 
left outer join q1 ON wo.wonum = q1.wonum_ref AND wo.siteid = q1.site_id; 
0

这个疑问的关键是枚举非取消“ WOS”。这仅仅是一个join随着row_number()

select w.*, 
     row_number() over (partition by wonum_ref, siteid order by r.sent_date desc) as seqnum 
from payment_wos w join 
    purchase_req r 
    on w.pay_numref = r.pay_numref 
where r.status <> 'CANCEL'; 

然后,您可以加入这work_order

select wo.workorderid, wo.wonum, wo.siteid, wr.pay_value 
from work_order wo left join 
    (select w.*, 
      row_number() over (partition by wonum_ref, siteid order by r.sent_date desc) as seqnum 
     from payment_wos w join 
      purchase_req r 
      on w.pay_numref = r.pay_numref 
     where r.status <> 'CANCEL' 
    ) wr 
    on wo.wonum_ref = wr.wonum_ref and wo.siteid = wr.siteid and wr.seqnum = 1; 
+0

感谢戈登,尽管在每次付款都被取消的情况下,这仍然显示不正确的值。在这种情况下,pay_value显示为最旧的取消值而不是空(或零)。 – Tantalus86

+0

@ Tantalus86。 。 。它应该在这种情况下显示NULL。 'WHERE'子句在'row_number()'之前被处理,所以我不知道如何包含取消的值。在某些记录中,“CANCEL”可能有细微差别吗? –