2016-04-06 13 views
0

etkili tarihe içinde çalışanların ücret alın

My veri

EMPLOYEE RATE tablodur ben sql server belirli bir tarih aralığında hesaplayın ÇALIŞAN Maaş almak için bir şartı var:

EMPL_ID EFFECTIVE_DATE WAGE  
101  5/23/2015 20 
101  6/2/2016  30 

PROJECT tablo:

EMPL_ID HRS_DT PROJECT_ID HOURS 
101  1/1/2015 10001  8 
101  1/2/2015 10001  8 
101  1/3/2015 10001  8 
...  ....  .....  .... 
101  6/2/2016  ....  ... 

Beklenen sonuç: Eğer empl_id sütun üzerinde iki tabloyu birleştirmek ve etkili veri daha sonra proje tarihinden daha herhangi employee_rate satır yok sayabilirsiniz Başlangıç ​​noktası olarak

EMPL_ID HRS_DT  PROJ_ID HR WAGES 
101  1/1/2015 10001 8  20 
101  1/2/2015 10001 8  20 
101  1/3/2015 10001 8  20 
...  ....  ... ... 
....  6/2/2016     30 
+4

SQL Server diyorsunuz, ancak Oracle etiketli. Hangi ürünü kullanıyorsunuz? – jarlh

+1

Bu çok basit bir SQL sorgusudur. Lütfen Google'ı kullanın ve bunu nasıl yapacağınıza bakın, bir deneyin ve kendiniz çözmeye çalışırken karşılaştığınız sorunları postalayın. – dfundako

+0

Gösterdiğiniz veriler önemsiz görünüyor. Ama bu her gün değişen ücretlerle ve iki tablodaki tarihler arasında bire bir ilişki ile. Ücret değişiklikleri ile bu boşluklardaki proje kayıtları arasında gerçekten boşluklar var mı ve bu tarihler için uygun ücret değerini bulmak mı istiyorsunuz? Yani, belirli bir tarihte ücretin ne olacağını bulmak mı istiyorsunuz? –

cevap

0

:

select p.empl_id, p.hrs_dt, p.project_id, p.hours, er.wage 
from project p 
join employee_rate er on er.empl_id = p.empl_id 
and er.effective_date <= p.hrs_dt; 

    EMPL_ID HRS_DT  PROJECT_ID  HOURS  WAGE 
---------- ---------- ---------- ---------- ---------- 
     101 2016-01-01  10001   8   20 
     101 2016-01-02  10001   8   20 
     101 2016-01-03  10001   8   20 
     101 2016-06-01  10001   8   20 
... 
     101 2016-06-02  10001   8   30 
     101 2016-06-02  10001   8   20 

.. Ama gördüğünüz gibi bu, bir ücret değişikliğiniz olduğunda birden çok sonuç veriyor. Yani sadece ücret değerini son kayıttan tutmak istersiniz, burada 'son' proje saatinden önce olanların en güncelidir. Karar vermek için row_number() gibi bir analitik işlevini kullanabilirsiniz hangi satır 1 bulmak için filtreleme sonra bir alt sorgu kullanarak ve olduğu rekor - En son geçerlilik tarihini sahip olacağı: orijinal soru olarak Oracle'da test

select empl_id, hrs_dt, project_id, hours, wage 
from (
    select p.empl_id, p.hrs_dt, p.project_id, p.hours, er.wage, 
    row_number() over (partition by p.empl_id, p.hrs_dt 
     order by er.effective_date desc) as rn 
    from project p 
    join employee_rate er on er.empl_id = p.empl_id 
    and er.effective_date <= p.hrs_dt 
) tmp 
where rn = 1; 

    EMPL_ID HRS_DT  PROJECT_ID  HOURS  WAGE 
---------- ---------- ---------- ---------- ---------- 
     101 2016-01-01  10001   8   20 
     101 2016-01-02  10001   8   20 
     101 2016-01-03  10001   8   20 
... 
     101 2016-06-01  10001   8   20 
     101 2016-06-02  10001   8   30 

etiketi, ancak bu SQL Server'da da çalışmalıdır.

+0

Teşekkürler. Ama bunu Sql server – user6167232

+0

içinde yapmam gerekiyor. Neden soruyu Oracle 11g olarak etiketlediniz ve ne kullandığınızı açıklığa kavuşturmak için istekleri dikkate almadınız? [Bu yardımcı olabilir] (http://stackoverflow.com/q/10756717/266304). –

+0

Üzgünüm sadece birden fazla forumda yanlış var.Teşekkürler – user6167232