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は計算値です。

クエリは次のようになります。

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を初めて使用し、本やGoogle検索から上記を取得することができました。しかし、範囲を計算することはできません。助けていただければ幸いです。

4

1 に答える 1

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
于 2012-04-20T12:15:15.990 に答える