2012-04-20 4 views
0

4 개의 열이있는 테이블이 있습니다. Plant_Id, Year, Month 및 MR. 나는 MR의 범위 (월 2 달 차이)를 계산할 수 있기를 원합니다. 테이블 (MaintenanceRatebepaen 테이블 이름)의 샘플은 다음과 같다 :이 관심을 모르겠어요'이전 행'의 열 값과 새 열의 값

Plant_ID Year Month MR 
CCAR  2009 1 0,706452 
CCAR  2009 2 0,625899 
CCAR  2009 3 0,636678 
CCAR  2009 4 0,736544 
CCAR  2009 5 0,552023 
CCAR  2009 6 0,418338 
CCAR  2009 7 0,502732 
CCAR  2009 8 0,64526 
CCAR  2009 9 0,743333 
CCAR  2009 10 0,555556 
CCAR  2009 11 0,297561 
CCAR  2009 12 0,338608 
CCAR  2010 1 0,380783 
Etc. 

하지만 Plant_id는 25 개 가지 값을 가질 수, 2008 년 - 2012 년 월 일 -12, MR은 계산 된 값입니다.

쿼리는 다음과 같습니다

SELECT Plant_Id, Jaar, Maand 
    , (SUM(Compl) + 0.000)/SUM(Total) AS MR 
FROM (
     SELECT Plant_Id, Jaar, Late, EarlyJobs, OnTimeJobs, Maand 
      , SUM(EarlyJobs + OnTimeJobs) AS Compl 
      , SUM(EarlyJobs) + SUM(Late) + SUM(OnTimeJobs) AS Total 
     FROM MaintenanceRatebepaen AS MaintenanceRatebepaen_1 
     GROUP BY Plant_Id, Jaar, Maand, Late, OnTimeJobs, EarlyJobs 
    ) AS MaintenanceRatebepaen 
WHERE (Jaar >= 2009) AND (Jaar <= 2011) AND (Plant_Id = 'CCAR') 
GROUP BY Jaar, Plant_Id, Maand 
ORDER BY Plant_Id, Jaar, Maand 

내가 SQL에 새로 온 사람, 내가 책에서 위의를 얻을 검색을 구글 수 있었다. 하지만 계산 범위를 얻을 수 없다, 어떤 도움을 크게 주시면 감사하겠습니다!

+0

정확히 무엇을 찾으십니까? 현재 달과 이전 달 사이에 MR의 차이가 있습니까? – Tobsey

답변

1

월별 차이가 궁금하십니까?

데이터

declare @data table (PlantId nvarchar(5), [Year] nvarchar(4), [Month] int, MR decimal(10,10)) 

INSERT @data VALUES 
('CCAR','2009','1','0.706452'),('CCAR','2009','2','0.625899'),('CCAR','2009','3','0.636678'),('CCAR','2009','4','0.736544'),('CCAR','2009','5','0.552023'),('CCAR','2009','6','0.418338'),('CCAR','2009','7','0.502732'),('CCAR','2009','8','0.64526'),('CCAR','2009','9','0.743333'),('CCAR','2009','10','0.555556'),('CCAR','2009','11','0.297561'),('CCAR','2009','12','0.338608'),('CCAR','2010','1','0.380783') 

쿼리

;with cte as (
    SELECT *, ROW_NUMBER() OVER (ORDER BY Year DESC, Month DESC) AS RowNumber FROM @data 
) 
select d1.PlantId 
    , d1.Year 
    , d1.Month 
    , d1.MR 
    , d1.MR-d2.MR AS [ChangeMRFromPreviousMonth] 
from cte d1 
LEFT OUTER JOIN cte d2 
    on d2.RowNumber = (d1.RowNumber+1) 
order by d1.RowNumber DESC 

결과 :

PlantId Year Month  MR          ChangeMRFromPreviousMonth 
------- ---- ----------- --------------------------------------- --------------------------------------- 
CCAR 2009 1   0.7064520000       NULL 
CCAR 2009 2   0.6258990000       -0.0805530000 
CCAR 2009 3   0.6366780000       0.0107790000 
CCAR 2009 4   0.7365440000       0.0998660000 
CCAR 2009 5   0.5520230000       -0.1845210000 
CCAR 2009 6   0.4183380000       -0.1336850000 
CCAR 2009 7   0.5027320000       0.0843940000 
CCAR 2009 8   0.6452600000       0.1425280000 
CCAR 2009 9   0.7433330000       0.0980730000 
CCAR 2009 10   0.5555560000       -0.1877770000 
CCAR 2009 11   0.2975610000       -0.2579950000 
CCAR 2009 12   0.3386080000       0.0410470000 
CCAR 2010 1   0.3807830000       0.0421750000 

당신이 필요로 무엇인가요? 검색어에 추가 열이 많이 포함되어 있으므로 원하는 항목을 포함할지 여부를 모르겠습니다.

*이 당신의 의견에 대 한 응답에서 편집 * , 당신은 추가 ROWNUMBER 컬럼과 함께 CTE 내부 쿼리를 넣어해야합니다. d1과 d2는 해당 CTE의 별명입니다. 이 작업을 수행해야한다고 생각합니다.

;with cte as (
    SELECT Plant_Id, Jaar, Maand 
     , (SUM(Compl) + 0.000)/SUM(Total) AS MR 
     , ROW_NUMBER() OVER (ORDER BY Jaar DESC, Maand DESC) AS RowNumber 
    FROM (
     SELECT Plant_Id, Jaar, Late, EarlyJobs, OnTimeJobs, Maand 
      , SUM(EarlyJobs + OnTimeJobs) AS Compl 
      , SUM(EarlyJobs) + SUM(Late) + SUM(OnTimeJobs) AS Total 
     FROM MaintenanceRatebepaen AS MaintenanceRatebepaen_1 
     GROUP BY Plant_Id, Jaar, Maand, Late, OnTimeJobs, EarlyJobs 
    ) AS MaintenanceRatebepaen 
    WHERE (Jaar >= 2009) AND (Jaar <= 2011) AND (Plant_Id = 'CCAR') 
    GROUP BY Jaar, Plant_Id, Maand 
    ORDER BY Plant_Id, Jaar, Maand 
) 
select d1.PlantId 
    , d1.Jaar 
    , d1.Maand 
    , d1.MR 
    , d1.MR-d2.MR AS [ChangeMRFromPreviousMonth] 
from cte d1 
LEFT OUTER JOIN cte d2 
    on d2.RowNumber = (d1.RowNumber+1) 
order by d1.RowNumber DESC 
+0

대단히 감사합니다 !! 그게 내가 필요한거야! 질문이 하나 더 있습니다. (SQL 입문 ...) : 쿼리에 코드를 어떻게 삽입합니까? 시도했지만 몇 가지 오류가 발생했습니다 .... (알 수없는 열 이름) '하나의 rownumber'에 가입하는 '임시'테이블을 만드는 것을 올바르게 이해합니까? 그리고 그것을 사용하여 MR 변화를 계산합니까? – Benne

+0

내 질문은 짐작합니다 : 어느 테이블 (cte, d1, d2)도 '생성'해야합니까. cte가 내 'MaintenannceRatebepaen'테이블이라는 것이 맞습니까? 그래서 'd1'과 'd2'를 만들어야합니까? 이것을 기존 쿼리에 삽입 할 수 있습니까? 다시 미리 감사드립니다! 너의 도움은 크게 감사 하네. – Benne

+0

제 수정 된 답변을 참조하십시오. 내 대답이 도움이된다면 우리가 도와 줄만큼 받아 들일 수있다 : o) – Paddy

관련 문제