2011-05-09 2 views
0

특정 클라이언트의 최대 날짜를 찾아야합니다.이 날짜는 최신 날짜 (또는 현재 날짜)로 처리됩니다. 그런 다음 거기에서 52 주에서 27 주 전에 돌아가서 합계 (시간)를 계산해야합니다. 최신 날짜 (또는 현재 날짜)로 26 주 및 합계 (시간)를 계산합니다.주 단위의 시간 합계를 계산 하시겠습니까?

ClientID StoreID period  hours 
    1  10  2010-04-19 8.04 
    1  10  2010-04-20 6.24 
    1  10  2010-04-21 8.26 
    1  20  2010-04-22 7.94 
    1  20  2010-04-23 22.43 
    1  20  2010-04-24 22.99 
    2  5  2010-12-19 130.67 
    2  5  2010-12-26 159.26 
    2  5  2011-01-02 113.59 
    2  5  2011-01-09 12.66 
    2  8  2011-01-16 22.34 
    2  8  2011-01-23 11.35 

출력을 얻으려면 SQL에서 계산하는 방법을 알려주십시오. 질문이 있으시면 저에게 물어보십시오.

+2

무엇을 시도 했습니까? 지금까지 뭐라구? 당신은 개념적 "어떻게 이것을 달성 하는가"또는 실제 코드를 찾고 있습니까? –

+0

코드를 찾고 있습니다. – James123

+0

좋아요, 당신이 제공 한 샘플 데이터를 기반으로, 당신은 어떤 출력을 기대합니까? –

답변

2

두 가지 쿼리를 사용하는 것이 가장 간단합니다. 첫 번째는 경계 날짜를, 두 번째는 합계를 계산합니다. 모든 쿼리를 하나의 쿼리로 롤아웃 할 수 있지만 차이점을 많이 만들 것이라고는 생각하지 않습니다.

DECLARE 
    @BeginDate datetime, 
    @MidDate datetime 

SELECT 
    @BeginDate = DATEADD(wk, -52, MAX(period)), 
    @MidDate = DATEADD(wk, -25, MAX(period)) 
FROM TableName 
WHERE ClientID = @ClientID 

SELECT 
    SUM(CASE 
      WHEN period >= @BeginDate AND period < @MidDate THEN hours 
      ELSE 0 
     END) AS HoursInFirstHalf, 
    SUM(CASE 
      WHEN period >= @MidDate THEN hours 
      ELSE 0 
     END) AS HoursInLastHalf 
FROM TableName 
WHERE ClientID = @ClientID 
+0

내가 틀렸을 수도 있지만 질문을 읽은 방법에 따라 OP가 모든 클라이언트에게 이것을 원할 가능성이 높습니다. 그렇지 않으면 당신의 접근 방식이 매우 산뜻하다고 생각합니다. (단지 '25'대신에 '27'이어야합니다.) 나는 아마도 첫 번째 SELECT를 원래 테이블에 다시 조인 될 subselect로 변환 할 것입니다. –

+0

@Andriy : 질문에 "그 특정 고객에게"*라고 쓰여 있습니다. 그것은 "모든 고객을위한 것"과 정반대입니다. 그것이 OP가 실제로 의미했던 것이면 그는 그 문제를 잘못 명시했다. 당신은 또한 주 수에 관하여 부정확하다; OP 상태는 * 시작 * 날짜로부터 27 주, 같은 일인 * 종료 * 날짜에서 25 주를 뺍니다. 마지막으로, 내가 말했듯이, 당신은 subselect와 함께 하나의 쿼리로 이것을 굴릴 수 있지만 그렇게하는 것은 아무런 이득이 없다. 이것은 쿼리를 읽기 쉽게 만든다. (아마도 이것이 인라인 TVF라면 중요 할 것이다.) – Aaronaught

+0

OP의 서버 버전이 2005 이상인지 확신 할 수는 없지만 CTE를 사용하면 스크립트를 읽기 쉽게 만들 수 없다고 생각합니다. 어쨌든, 나는 모든 클라이언트에 대해 데이터를 리턴하도록 솔루션을 수정하는 컨텍스트에서만 subselect로 변환하는 것에 대해 이야기하고있었습니다. 단일 클라이언트 솔루션을 계속 사용하고 있다면 동의합니다. 첫 번째 선택을 하위 쿼리로 변환하는 데별로 이득이 없습니다. –