2017-10-31 11 views
0

たとえば、次の表があります。先月からの増減を計算したいと思います。これは先月からの変化のパーセンテージを表示します。SQL Server:選択した月と前月の売上高の間に変化が見つかりました

 
Location Month Sales 
A   Jan  1753 
B   Jan  32130 
C   Jan  71353 
D   Jan  74885 
E   Jan  50241 
F   Jan  66393 
A   Feb  80633 
B   Feb  67918 
C   Feb  73330 
D   Feb  33269 
E   Feb  78915 
F   Feb  98817 
A   Mar  80633 
B   Mar  67918 
C   Mar  73330 
D   Mar  33269 
E   Mar  78915 
F   Mar  98817 

私は次のようなテーブルを作成します。スタックのオーバーフローを検索しましたが、テーブルを取得できませんでした。

 
Location Selected Current_Month Prvisous_Month Change 
A   Feb   80633   1753   4500% 
B   Feb   67918   32130   111% 
C   Feb   73330   71353   3% 
D   Feb   33269   74885   -56% 
E   Feb   78915   50241   57% 
F   Feb   98817   66393   49% 
+0

は自己結合を実行してください。 – jarlh

+0

列が見つからない限り、テーブルはあまりうまく設計されていません。どの月に属しているのかを比較するにはどうすればいいですか? datetimesには 'DATETIME'オブジェクトを使うべきです。 –

答えて

0

何かこれは良いスタートです。 Cool_Br33zeが指摘しているように、この表の日付の列を再考する必要があります。

あなたは今、あなたのタスクの主要な問題は以下のようになり Monthの正しい順序で簡単にこの

SELECT location, 
     month, 
     sales, 
     lag(sales) over (order by month) previous, 
     (sales/lag(sales) over (order by month) - 1) * 100 as change 
FROM your_table 
WHERE month = 'feb' 

ようLAGウィンドウ関数を使用することができ、あなたがこれまでにMonth属性を変更すると仮定すると

SELECT 
    *, 
    referenceTimePeriod/NULLIF(comparisonTimePeriod, 0) -- avoid DIV0 errors 
FROM (
    SELECT Location, Sales 
    FROM myTable 
    WHERE month = 'jan' 
) AS referenceTimePeriod 
FULL JOIN(
    SELECT Location, Sales 
    FROM myTable 
    WHERE month = 'feb' 
) AS comparisonTimePeriod ON referenceTimePeriod.Location = comparisonTimePeriod .Location 
0

はるかに簡単に日付、または数字。

EDIT:あなたは、現在のデータのためのCool_Br33zeの発注・ソリューションを使用することができます。

SELECT location, 
     month, 
     sales, 
     lag(sales) over (order by MONTH([T].[Month] + ' 1 1900')) previous, -- taken from Cool_Br33ze solution 
     (sales/lag(sales) over (order by MONTH([T].[Month] + ' 1 1900')) - 1) * 100 as change 
FROM your_table 
WHERE month = 'feb' 

しかし、最良のオプションは、あなたができる場合はMonth ...

1

のデータ型を変更することです何らかの理由で「月」列のデータ型を変更しないと、この解決策が機能する可能性があります。

DECLARE @Table TABLE ([Location] CHAR(1), [Month] NVARCHAR(3), Sales INT) 
INSERT INTO @Table 
    ([Location], [Month], Sales) 
VALUES 
    ('A',N'Jan',1753), 
    ('B',N'Jan',32130), 
    ('C',N'Jan',71353), 
    ('D',N'Jan',74885), 
    ('E',N'Jan',50241), 
    ('F',N'Jan',66393), 
    ('A',N'Feb',80633), 
    ('B',N'Feb',67918), 
    ('C',N'Feb',73330), 
    ('D',N'Feb',33269), 
    ('E',N'Feb',78915), 
    ('F',N'Feb',98817), 
    ('A',N'Mar',80633), 
    ('B',N'Mar',67918), 
    ('C',N'Mar',73330), 
    ('D',N'Mar',33269), 
    ('E',N'Mar',78915), 
    ('F',N'Mar',98817) 

DECLARE @Selection NVARCHAR(3) = N'Feb' -- Enter Selected Month here 

;WITH cteX 
AS(
    SELECT 
      T.[Location] 
     , T.[Month] 
     , MonthNum = MONTH([T].[Month] + ' 1 1900') --Use some dummy date here 
     , T.Sales 
    FROM @Table T 
) 
SELECT 
     T.[Location] 
    , Selected  = T.Month 
    , CurrentMonth = T.Sales 
    , PreviousMonth = T1.Sales 
    , Change  = CAST((T.Sales - T1.Sales)/(T1.Sales * 1.0) * 100.0 AS DECIMAL) 
FROM cteX T 
INNER JOIN 
    cteX T1 ON T1.MonthNum = T.MonthNum - 1 
       AND T1.[Location] = T.[Location] 
WHERE 
    T.[Month] = @Selection 

出力

enter image description here

+0

いいです、私は彼の奇妙なデータを変換しようともしなかった:) –

0
SELECT A.Location, 'Feb' AS Selected, A.Sales AS Current_Month 
        , B.Sales AS Prvisous_Month, (A.Sales - B.Sales)/ B.Sales AS Change 
FROM YourTable A JOIN YourTable B 
        ON A.Month = B.Month + 1 -- You will have to represent Months by numbers 
WHERE A.Month = 2      -- Selected month 
関連する問題