2012-04-17 3 views
8

여기 SQL 초보자입니다. 직원 시간표 정보를 출력하고 효과적인 직원 원가 계산률에 따라 비용을 계산하는 원가 계산 쿼리를 생성하려고합니다.비용 날짜를 기준으로 유효한 원가 계산율을 선택하는 SQL 쿼리

내 질문은 여기에있는 질문과 비슷합니다 : Retro-active effective date changes with overlapping dates하지만 역 활동이나 겹치는 기간은 다루지 않습니다.

테이블 예 (레이트 표에 Null 값이 현재 레이트를 나타낸다)

CREATE TABLE Emp_Rate 
(
    Emp int, 
    Rate money, 
    Rate_Start datetime, 
    Rate_Exp datetime 
) 

CREATE TABLE Emp_Time 
(
    Emp int, 
    Chrg_Date datetime, 
    Chrg_Code varchar(10), 
    Chrg_Hrs decimal(8, 2) 
) 

Insert into Emp_Rate (Emp,Rate,Rate_Start,Rate_Exp) Values ('1','20','5/1/09','4/30/10') 
Insert into Emp_Rate (Emp,Rate,Rate_Start,Rate_Exp) Values ('1','21','5/1/10','4/30/11') 
Insert into Emp_Rate (Emp,Rate,Rate_Start,Rate_Exp) Values ('1','22','5/1/11',NULL) 

Insert into Emp_Time (Emp,Chrg_Date,Chrg_Code,Chrg_Hrs) Values ('1','5/10/09','B','8') 
Insert into Emp_Time (Emp,Chrg_Date,Chrg_Code,Chrg_Hrs) Values ('1','5/10/10','B','8') 
Insert into Emp_Time (Emp,Chrg_Date,Chrg_Code,Chrg_Hrs) Values ('1','5/10/11','B','8') 

쿼리 (복귀 명백하게 다중 레이트 항목 (의한 속는))

Select Emp_Time.Emp, 
     Cast(Emp_Time.Chrg_Date as DATE) as 'Chrg_Date', 
     Emp_Time.Chrg_Code, 
     Emp_Time.Chrg_Hrs, 
     Emp_Rate.Rate, 
     Emp_Time.Chrg_Hrs * Emp_Rate.Rate as 'Cost' 

From Emp_Time inner join 
     Emp_Rate on Emp_Rate.Emp = Emp_Time.Emp 

Order By [Emp],[Chrg_Date] 

원하는 출력 :

Emp Chrg_Date Chrg_Code Chrg_Hrs Rate Cost 
1 2009-05-10 B   8.00  20.00 160.00 
1 2010-05-10 B   8.00  21.00 168.00 
1 2011-05-10 B   8.00  22.00 176.00 

나는 연산자로 Between을 사용하여 주변을 돌아 다녔다. 청구일을 기준으로 올바른 요율을 찾아 내고 행운이 없었던 하위 검색어입니다.

감사합니다.

+0

일을 상세 질문에 대해. 원하는 출력물에 Emp 2가 표시되지만 Emp 1에 대한 입력물은 오타입니다. – Taryn

+0

예, 오타되었습니다! 저의 원래 예에는 두 명의 직원이있었습니다. 수정 됨. – Jaxaeon

+0

데이터베이스 유형으로 질문에 태그를 답니다. MySQL은? – barsju

답변

2

DBMS 유형을 지정하지 않았습니다. 아래 답변은 SQL Server에 대한 것입니다. 나는 다른 방법이 있다고 확신하지만이 방법으로 nullRate_Exp 날짜를 현재 날짜로 바꿀 것입니다.

Select et.Emp, 
     Cast(et.Chrg_Date as DATEtime) as 'Chrg_Date', 
     et.Chrg_Code, 
     et.Chrg_Hrs, 
     er.Rate, 
     et.Chrg_Hrs * er.Rate as 'Cost' 
From Emp_Time et 
inner join 
(
    SELECT Emp 
     , Rate 
     , Rate_Start 
     , CASE 
      WHEN Rate_Exp is Null 
      THEN Convert(varchar(10), getdate(), 101) 
      ELSE Rate_Exp 
      END as Rate_Exp 
    FROM Emp_Rate 
)er 
    on er.Emp = et.Emp 
WHERE (et.Chrg_Date BETWEEN er.Rate_Start AND er.Rate_Exp) 
Order By et.Emp,et.Chrg_Date 

또는 당신의 WHERE 절에 CASE 문을 사용

Select et.Emp, 
     Cast(et.Chrg_Date as DATEtime) as 'Chrg_Date', 
     et.Chrg_Code, 
     et.Chrg_Hrs, 
     er.Rate, 
     et.Chrg_Hrs * er.Rate as 'Cost' 
From Emp_Time et 
inner join Emp_Rate er 
    on er.Emp = et.Emp 
WHERE (et.Chrg_Date 
     BETWEEN er.Rate_Start 
       AND CASE WHEN er.Rate_Exp Is Null 
      THEN Convert(varchar(10), getdate(), 101) 
      ELSE er.Rate_Exp END) 
+0

멋집니다! 재미 있어야 할 묶음이 더 많은 쿼리로 패치해야합니다. 몇 가지 옵션을 제공해 주셔서 감사합니다! – Jaxaeon

+0

확실한 것, 도와 줘서 기쁩니다. – Taryn

+0

구현되어 매력처럼 작동합니다. 우아함을 위해 두 번째 솔루션을 사용하도록 선출되었습니다. – Jaxaeon

관련 문제