2016-06-28 20 views
0

これは以前に尋ねられたことは知っていますが、誰かが願っていると、はっきりと説明できます。SQLの行全体の変化率を計算します

マイデータ:

year quarter month item sales quantity month_number 
2011  1 January a 4250 85000  1 
2011  1 February a 4600 92000  2 
2011  1 March  a 3700 74000  3 
2011  2 April  a 4215 84300  4 
2011  2 May  a 5120 102400  5 
2011  2 June  a 5010 100200  6 
2011  3 July  a 4690 93800  7 
2011  3 August  a 4900 98000  8 
2011  3 September a 5400 108000  9 
2011  4 October a 5820 116400  10 
2011  4 November a 5900 118000  11 
2011  4 December a 5730 114600  12 
2011  1 January b 1417 35417  1 
2011  1 February b 1533 38333  2 
2011  1 March  b 1233 30833  3 
2011  2 April  b 1405 35125  4 
2011  2 May  b 1707 42667  5 
2011  2 June  b 1670 41750  6 
2011  3 July  b 1563 39083  7 
2011  3 August  b 1633 40833  8 
2011  3 September b 1800 45000  9 
2011  4 October b 1940 48500  10 
2011  4 November b 1967 49167  11 
2011  4 December b 1910 47750  12 

私は、各項目(& b)のために、月に月からの販売のためのパーセント変化が含まれている最後に新しい列を作成しようとしています。したがって、変更がないため、month_number 1もnull値になります。しかし、month_number 2は(4600 - 4250)/ 4250と等しくなければならず、0.082です。 など。

どのような考えですか?前もって感謝します。

+0

四半期は重複しています。 (月として) – Strawberry

+0

どのrdbms?あなたはLAGを使用することができますSQL Server。また、自己参加でも行うことができます – Matt

+0

説明したいコードがある場合は、コードを入力する必要があります。 –

答えて

2
SELECT 
    t1.* 
    ,CASE 
     WHEN t2.sales IS NULL THEN NULL 
     ELSE (t1.sales - t2.sales)/(t2.sales * 1.00) 
    END AS MonthOverMonth 
FROM 
    #TblName t1 
    LEFT JOIN #TblName t2 
    ON t1.[Year] = t2.[Year] 
    AND t1.month_number - 1 = t2.month_number 
    AND t1.item = t2.item 

ゴードンは、LAGは私が考えていた道に答える持っていますが、私はあなたが何かのMySQLを言った場合の非窓関数のバージョンを書いていた:ほとんどのデータベースはlag()をサポートしています。とにかく、LAGはSQL 2012 +の答えです。 SELECT @@VERSIONは、使用しているMSSQLのバージョンを教えてください。しかし、それがなくても、前月に自己参加して計算を行うことができます。

+0

これはトリックをした、ありがとう!何時間もグーグルで行きましたが、何か役に立つものが見つかりませんでした。 –

+0

ようこそ。すべての素晴らしいウィンドウ関数が自己結合について来る前に、比較のタイプに到達する良い方法 – Matt

0

あなたの質問にはデータベースでタグ付けされていないので、ANSI標準機能の点でこの回答になります。

select d.*, (sales - prev_sales)/(prev_sales * 1.0) 
from (select d.* 
      lag(sales) over (partition by item order by year, month) as prev_sales 
     from mydata md 
    ) d; 
+0

ゴードン、ありがとう。私はMicrosoft SQL Serverを使用しています(あなたの質問に答えている場合)。私はラグ()を試して、それはサポートされていません。 @MattCollins。 –

+0

。 。 。 SQL Serverは2012年から 'lag()'をサポートしています。 –

+0

私が使っているものはサポートしていません。私はあなたが何を言いたいのか分かりません。 @MattCollins。 –

関連する問題