2012-04-08 4 views
-2

나는 아래와 같은 같은 레코드 집합을 반환하는 쿼리 가지고있다 -고유 행

Date Dept  commission 

5-Apr Sales  20 
4-Apr Sales  21 
1-Jan Marketing 35 

경우 1 : 난 1 1 월 및 4월 5일의 I 사이에 쿼리를 실행하는 경우

Date Dept  commission 

5 April Sales  76 

경우 2를 얻어야한다 : 내가 1월 1일 얀 31 일 사이에 쿼리를 실행할 때

로 출력을 얻어야한다
Date Dept  commission 

1 Jan Marketing 35 

사례 2는 최대/최신 날짜, 해당 날짜에 대한 부서 및 합의를 표시하는 경우 1을 처리하는 방법을 잘 내가 원하는 결과를 얻는 했나 날짜 범위를 넣을 때와 같이 간단하지만 아니다 해당 부서의 커미션, 선택한 날짜 범위의 날짜 출력은 선택한 날짜 범위의 합계 (커미션)가있는 최신 날짜 및 부서가있는 단일 행입니다.

+1

: 첫 번째 사례에 대한 쿼리를 실행하면 4april과 4 월 5 일을 얻고 두 번째 경우에는 4 월 4 일과 5 월 4 일을 얻어야하지만 결과는 달라질 수 있습니까? –

+0

안녕하세요. 미안 해요. 제 말대로 오타가되었습니다. 1 월 1 일부터 31 일까지 –

+0

71 세가 어디에서 왔습니까? @ 프리 야 : 질문을 편집 할 수 있습니다. –

답변

3
SELECT 
    MAX(Date)      AS Date 
    , (SELECT tt.Dept        
     FROM tableX tt 
     WHERE tt.Date = MAX(t.Date) 
    )        AS Dept 
    , SUM(Commission)    AS Commission 
FROM 
    tableX t 
WHERE 
    Date BETWEEN StartDate AND EndDate 

SQL-Server의 위의 작품은, MySQL은, 포스트 그레스는 sql-fiddle, test-1에서 볼 수 있듯이, 그러나 그것은 오라클 11g R2에서 작동하지 않습니다!


이 (sql-fiddle, test-2)하지만 작동합니다

SELECT 
    MAX(t.Date)  AS Date 
    , MIN(tt.Dept)  AS Dept    --- MIN, MAX irrelevant 
    , SUM(t.Commission) AS Commission 
FROM 
    (SELECT 
     MAX(Date)      AS Date 
    , SUM(Commission)    AS Commission 
    FROM 
     tableX 
    WHERE 
     Date BETWEEN StartDate AND EndDate 
) t 
    JOIN 
    tableX tt 
     ON tt.Date = t.Date 

MIN(tt.Dept) 당신이 최대 날짜 행보다이 사건의 알아서하는 데 사용됩니다, 하나 Sales와 행 Marketing 한 말 두 Apr-5

에서 이것은 LAST_VALUE 분석 함수 (sql-fiddle, test-3)를 사용하여도 작동합니다

SELECT 
    MAX(Date)  AS Date 
    , MIN(Dept)  AS Dept    
    , SUM(Commission) AS Commission 
FROM 
    (SELECT 
     Date      AS Date 
    , LAST_VALUE(Dept) OVER(ORDER BY Date 
       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 
          ) AS Dept 
    , Commission    AS Commission 
    FROM 
     tableX 
    WHERE 
     Date BETWEEN StartDate AND EndDate 
) t 
+0

귀하의 질문과 답장을 시도 할 것입니다. –

+0

아니요, 잘못되었습니다. 먼저 편집하겠습니다. –