2017-10-03 8 views
0

から蓄積:スタートは、私は次のようなデータを持つテーブルが来月

Month|Order|OrdersAcc 
APR |4 | NULL 
MAY |3 |4 
JUN |2 |7 
JUL |4 |9 

:私がする必要がどのような

Month|Order|OrdersAcc 
APR |4 |4 
MAY |3 |7 

は結果がでなければなりません代わりに、4月の意味の月からの蓄積を開始ですこれを達成できるクエリを手助けしてください。

これを簡略化してください。それは2のようになど月を表すと、4月を表す1と12まで1から整数をインクリメントしているので、私はmonth_sort2列を使用しています

SELECT  SUM(t2.OrdersAcc) AS OrdersAcc, t1.MONTH_sort2, t1.ActMonth 

FROM   dbo.tbl_ME_OrderCompletions AS t1 INNER JOIN 

          (SELECT  SUM(Orders) AS OrdersAcc, Region, MONTH_sort2 

           FROM   dbo.tbl_ME_OrderCompletions 

           GROUP BY Region, MONTH_sort2, ActMonth) AS t2 ON t1.Region = t2.Region AND t1.MONTH_sort2 >= t2.MONTH_sort2 

GROUP BY t1.Region, t1.MONTH_sort2, ActMonth 

:これは、蓄積を行い、クエリです。 1月(4月)からの数字は5月に表示し、5月からは蓄積する必要があります。これが参考になることを願っています。

+2

確かに数字を空中に投げ込み、人々が私のしたことを理解するでしょう。右? – sagi

+0

メカニックになると想像してください。あなたは来て、言う:私は車を持っている、それはドアとタイヤがあります。どうすれば私の友人マイクのような車を持つことができる、それは別の車のように見える。 – DanteTheSmith

+0

疲れたコードはありますか?あなたはケースとの和を試してみることができますどこwhere句を持っている月 Prathyush

答えて

0

は、SQL Server 2012年または私はあなたがウィンドウ関数に見てお勧めしたいの上であれ​​ば - 特に& LAGをリードしています。

あり、これを行うために他の方法がありますが、それは、ウィンドウ機能のパワーとどのようにそれらを一緒にチェーンにを紹介しています。

CREATE TABLE dbo.tbl_ME_OrderCompletions 
( 
    Month_Sort2 INT 
    ,Orders INT 
    ,Region NVARCHAR(20) 
) 

INSERT INTO dbo.tbl_ME_OrderCompletions 
VALUES (1,4,'Placeholder') 
     ,(2,3,'Placeholder') 
     ,(3,2,'Placeholder') 
     ,(4,4,'Placeholder') 
     ,(5,3,'Placeholder') 
     ,(6,1,'Placeholder') 
     ,(7,2,'Placeholder') 
     ,(8,4,'Placeholder') 
     ,(9,3,'Placeholder') 
     ,(10,7,'Placeholder') 
     ,(11,3,'Placeholder') 
     ,(12,9,'Placeholder') 


SELECT UPPER(CONVERT(NVARCHAR(3),DATENAME(mm,DATEADD(mm,t.MonthID + 3,-1)))) AS Month 
     ,t.Orders 
     ,LAG(t.SumOrders) OVER (ORDER BY MonthID) AS OrdersAcc 
FROM 
    (
     SELECT o.Month_Sort2 AS MonthID 
       ,o.Orders AS Orders 
       ,SUM(o.Orders) OVER (ORDER BY o.Month_Sort2) AS SumOrders 
     FROM dbo.tbl_ME_OrderCompletions o 
    ) t 
+0

あなたの提案を詳しく説明してください。小さな例がありますか? – altschuler

+1

確かに - 自分の投稿を編集します。 –

0

あなたが次のことを試すことができます。

DECLARE @DataSource TABLE 
(
    [month_row_id] INT 
    ,[motnh] VARCHAR(12) 
    ,[order] INT 

); 

INSERT INTO @DataSource ([month_row_id], [motnh], [order]) 
VALUES (1, 'APR', 4) 
     ,(2, 'MAY', 3) 
     ,(3, 'JUN', 2) 
     ,(4, 'JULY',4); 

SELECT [motnh] 
     ,[order] 
     ,SUM([order]) OVER (ORDER BY [month_row_id] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - [order] AS [OrderAcc] 
FROM @DataSource; 

enter image description here

アイデアは、現在の行までの値を蓄積しているが、簡単な操作で-現在の行の値を除外します。

また、月名が機能していないため、行を時間順に並べるためにmonth_row_id列を追加しました。

0

解決策が見つかりました。

SELECT  SUM(t2.OrdersAcc) AS OrdersAcc, t1.MONTH_sort2, t1.ActMonth 

FROM   dbo.tbl_ME_OrderCompletions AS t1 INNER JOIN 

          (SELECT  SUM(Orders) AS OrdersAcc, Region, MONTH_sort2 

           FROM   dbo.tbl_ME_OrderCompletions 


           GROUP BY Region, MONTH_sort2, ActMonth) AS t2 ON t1.MONTH_sort2 > t2.MONTH_sort2 

GROUP t1.MONTH_sort2, ActMonth 

私がしなければならなかったのは、Month_sort2のjoinをtoより大きいかより大きくすることでした。あなたのおかげでありがとう

+0

使用しているSQLのバージョンは?これはうまくいくかもしれませんが、行数が増えると非常に非効率になります。 – Shawn

0

あなたの質問を少し明確にする必要があります。しかし、私が集めているものから、あなたは探しています:

; WITH t AS (
    SELECT 4 AS monthNum, 'APR' AS m, 4 AS t UNION ALL 
    SELECT 5 AS monthNum, 'MAY' AS m, 3 AS t UNION ALL 
    SELECT 6 AS monthNum, 'JUN' AS m, 2 AS t UNION ALL 
    SELECT 7 AS monthNum, 'JUL' AS m, 4 AS t 
) 
SELECT s1.m,s1.t 
    , SUM(s1.prevT) OVER (ORDER BY s1.monthNum ROWS UNBOUNDED PRECEDING) AS totalT 
FROM (
    SELECT t.monthNum, t.m, t.t 
     , (LAG(t.t) OVER (ORDER BY t.monthNum)) AS prevT 
    FROM t 
) s1 
; 

1)これはMS SQL Server 2012以上でのみ動作します。

2)月を注文する方法が必要です。これを行うにはmonthNum列を追加しました。

============================================== ===== SQL 2008および2008R2用

; WITH t AS (
    SELECT 4 AS monthNum, 'APR' AS m, 4 AS t UNION ALL 
    SELECT 5 AS monthNum, 'MAY' AS m, 3 AS t UNION ALL 
    SELECT 6 AS monthNum, 'JUN' AS m, 2 AS t UNION ALL 
    SELECT 7 AS monthNum, 'JUL' AS m, 4 AS t 
) 
SELECT t3.m, t3.t, NULLIF(t3.runningTotal, t3.t) AS nulledRunningTotal 
FROM (
    SELECT t.monthNum, t.m, t.t 
     , (SELECT SUM(t2.t) FROM t t2 WHERE t2.monthNum <= t.monthNum) AS runningTotal 
    FROM t 
) t3 ; 

私は、これは私が実際に今までNULLIF()を使用したのは初めてかもしれないと思います。したがって、2008年より前に進む必要がある場合はNULLIF(t3.runningTotal,t3.t)CASE WHEN t3.runningTotal<>t3.t THEN t3.runningTotal ELSE NULL ENDに変更することができます。

関連する問題