2015-11-09 4 views
2

Я пытаюсь использовать разные вещи для получения данных в нужном формате, но безрезультатно. Мне нужно объединить 3 таблицы, которые показывают все из 1 таблицы, и добавить дополнительный столбец, который показывает самое последнее значение из таблицы 2, но учтите условие из таблицы 3. Отображение таблиц будет иметь больше смысла ... I ' упростили таблицы. Так вот таблица WorkOrder:Как получить самые последние значения в 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 имеет значение null) Затем это показывает все заказы на работу за исключением тех, где каждый платеж находится в состоянии «ОТМЕНА». Мне нужно, чтобы он показывал каждый рабочий заказ: 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

Ключа к этому запросу перечисление не-аннулирован " СУВ». Это просто 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 отображается как старое отмененное значение вместо null (или ноль). – Tantalus86

+0

@ Tantalus86. , , В этом случае он должен показывать «NULL». Предложение 'WHERE' обрабатывается до' row_number() ', поэтому я не вижу, как можно было бы включить отмененное значение. Возможно ли, что '' CANCEL'' может быть немного отличающимся в некоторых записях? –