2013-08-30 5 views
0

SELECT 문을 사용하여 테이블을 계산하려고했습니다.여러 행의 MySQL 조건

-------------------------------------------------------------- 
AgentID  |  Date  | Incurred  | FallOffDate 
============================================================== 
kegomez  | 2012-11-19 |  2.0  | 2013-11-19 
kegomez  | 2012-11-24 |  0.5  | 2013-11-24 
kegomez  | 2013-01-21 |  2.0  | 2014-01-21 
kegomez  | 2013-08-18 |  2.0  | 2014-08-18 

내가 선택시에 계산을 할 가능성이 뷰를 만들려고했지만 지금까지 운이 없다 :이 같은 테이블이 있습니다. 결국 테이블은 이렇게 보일 것입니다.

-------------------------------------------------------------- 
AgentID  |  Date  | Incurred  | 90 | 180 | Total | FallOffDate 
============================================================== 
kegomez | 2012-11-19 |  2.0  | 2.0 | 2.0 | 2.0  | 2013-11-19 
kegomez | 2012-11-24 |  0.5  | 0.5 | 0.5 | 2.5  | 2013-11-24 
kegomez | 2013-01-21 |  2.0  | 1.0 | 0.0 | 2.5  | 2014-01-21 
kegomez | 2013-08-18 |  2.0  | 2.0 | 2.0 | 4.5  | 2014-08-18 

전체 열은 값을 계산하기 위해 이전 행의 값을 사용합니다. 예를 들어 행 4의 날짜는 행 3의 날짜를 참조하여 날짜가 더 큰지 확인해야합니다. 하위 쿼리로이 작업을 수행해야합니까? 이것이 결국 작동하게되는 방법은 더 이상 발생하지 않을 경우 에이전트가 90 일에서 최대 180 일마다 1 포인트를 풀어 버리는 것입니다. 따라서 다른 행을 참조해야하는 이유입니다. 이 데이터가 현재 Excel에 있지만 도움이된다면 관리하기에는 너무 커지고 더 나은 성능으로 이동해야합니다.

SELECT mo.AgentID, mo.date, 
     @r AS 'LAG(date)', 
     (case when @r<Date then 'YES' when @r is null then 'IS NULL' else 'NO' end) 'Is Bigger', 
     (@r := Date) AS Date 

FROM (
     SELECT m.* 
     FROM (
       SELECT @_date = NULL 
       ) variable, 
       data m 
     ORDER BY 
       AgentID 
     ) mo 
WHERE (CASE WHEN @_date IS NULL OR @_date <> date THEN @r := NULL ELSE NULL END IS NULL) 
     AND (@_date := date) IS NOT NULL 

당신은을 볼 수

SELECT AgentID, Date, Incurred, 
    @90 := IF(Date<=CURDATE()-90 AND @r=0, Incurred-1.0, IF(Difference>90, Incurred-1, Incurred)) AS 90Day, 
    @180 := IF(Date<=CURDATE()-90 AND @r=0, Incurred-1.0, IF(Difference>180, Incurred-2, @90)) AS 180Day, 

    @Total := IF(@180<0,0,IF(FallOffDate<=CURDATE(),0, @180)) AS Total, 

    FallOffDate 

FROM (SELECT mo.AgentID, mo.Incurred, FallOffDate, 
     @r AS LEAD_date, 
     DATEDIFF(@r,Date) AS Difference, 
     (@r := Date) AS Date 

FROM (
     SELECT m.* 
     FROM (
       SELECT @_date = NULL 
       ) VARIABLE, 
       attendance m 
     ORDER BY 
       AgentID, Date DESC 
     ) mo 
WHERE (CASE WHEN @_date IS NULL OR @_date <> date THEN @r := NULL ELSE NULL END IS NULL) 
     AND (@_date := date) IS NOT NULL) T 
ORDER BY AgentID, Date; 

답변

0

예, 당신은 하위 쿼리와 함께이 작업을 수행 (당신이 3 행에 날짜를 액세스하기 위해 4 행을 원하는 경우)이 같은 뭔가를 시도해야 데모 here

작업 아니면 3 행 4 행의 날짜에 액세스 할 수 있는지하려는 경우이 쿼리를 시도 할 수 있습니다

SELECT AgentID,date,LEAD_date,concat(Difference,' days') FROM 
(SELECT mo.AgentID, 
     @r AS LEAD_date, 
     DATEDIFF(@r,Date) as Difference, 
     (@r := Date) AS Date 

FROM (
     SELECT m.* 
     FROM (
       SELECT @_date = NULL 
       ) variable, 
       data m 
     ORDER BY 
       AgentID,date desc 
     ) mo 
WHERE (CASE WHEN @_date IS NULL OR @_date <> date THEN @r := NULL ELSE NULL END IS NULL) 
     AND (@_date := date) IS NOT NULL) T 
order by AgentID,date; 

작동중인 데모를 볼 수 있습니다. here

+0

여기가 올바른 방향이라고 생각합니다. 그러나 나는 약간 잘못 계산했다고 생각합니다. 무슨 일이 일어나야 만하는 건데 행 3은 행 4의 날짜 사이의 시간을 계산해야한다는 것입니다. 나는 테스트를 실행했고 훌륭하게 작동하지만 지금은 우리가 그것을 거꾸로 가지고 있다고 생각합니다. –

+0

좋아, 변경 사항을 반영하도록 답변을 업데이트했습니다. –

+0

감사합니다. 큰 도움이되었습니다. –