2015-11-09 43 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」可能有細微差別嗎? –