2012-04-20 6 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年、月1 -12、MRは計算値です。クエリは次のようになります

:私はSQLに新たなんだ

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 

、私は本から上記を取得し、検索をGoogleに管理します。しかし、私は計算された範囲を得ることができない、どんな助けも大いに感謝される!

+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

ありがとうございます!それはまさに私が必要なものです!もう1つの質問(私はSQLの初心者です...):クエリにコードを挿入するにはどうすればいいですか?私は試みましたが、いくつかのエラーが発生しました....(未知の列名)「一時的な」テーブルを作成して「1つのrownumber」に参加することを正しく理解していますか?それを使ってMR変化を計算しますか? – Benne

+0

私の質問は次のとおりです:どのテーブル(cte、d1、d2)も「作成」する必要があります。 cteが私の 'MaintenannceRatebepaen'テーブルであるのは正しいですか?だから私は 'd1'と 'd2'を作成する必要がありますか?既存のクエリにこれを挿入できますか?再度前もって感謝!あなたの助けが大いにありがたいです。 – Benne

+0

私の編集した回答をご覧ください。私の答えが役に立ったら、それをアップアップして、それを受け入れることができます:o) – Paddy

関連する問題