2016-06-29 7 views
0

私は、購入した作業ユニットの数と作業ユニットの消費したユニットの合計のうち、残りの作業ユニット数を毎月取得しようとしています。クローズの計算(過去を含む2つのビューの合計)

が、私は二つの可能性を試してみましたが、両方は欠陥があります:最初のテストでは

を、私は私が望む最後の行列ですべての月を示すために、毎月、毎年含まれている「ヶ」の表を作成しましたこれらのデータを使用して作成します。この1つでは、消費された作業ユニットがあるときはいつでもクローズしますが、そうでない場合は、最後のクローズを取得しないため、「空」です。

USE OTRS_Revised 
SELECT  [Customer], CASE WHEN [Year] < 2016 THEN 1 ELSE [Year] END AS [Year], CASE WHEN [Year] < 2016 THEN 0 ELSE [Month] END AS [Month], [Closing] AS Total, SUM([Closing]) 
         OVER (PARTITION BY [Customer] ORDER BY [Year], [Month] ROWS UNBOUNDED PRECEDING) AS Closing 
FROM   [dbo].[WU_Closing_View] 
WHERE [Customer] IN ('CustomerList') 
GROUP BY [Customer], [Year], [Month], [Closing] 
UNION ALL 
SELECT  '' AS Customer, CASE WHEN [Year] < 2016 THEN 1 ELSE [Year] END AS [Year], CASE WHEN [Year] < 2016 THEN 0 ELSE [Month] END AS [Month], '' AS Total, '' AS Sum_bought 
FROM   [dbo].Months 
WHERE  [Year] <= 2016 
GROUP BY Year, Month 
ORDER BY Customer, Year, Month 

また、以下のクエリを使用して「月単位」にしようとしました。行ドンそれは一ヶ月のために働くが、私は、あなたが労働組合を行うとき年の毎月のアプローチでは2016年

SELECT 
    (SELECT SUM(Closing) AS Expr1 
    FROM   OTRS_Revised.dbo.WU_Bought_View 
    WHERE  (Customer LIKE 'SomeCustomer') AND (DATEADD(Year, Year - 1900, DATEADD(Month, Month - 1, DATEADD(day, 0, 0))) <= DATEADD(Year, 2016 - 1900, DATEADD(Month, 5 - 1, DATEADD(day, 0, 0)))) 
    GROUP BY Customer) 

+ 

(SELECT  SUM(Closing) AS Expr1 
FROM   OTRS_Revised.dbo.WU_Consumed_View 
WHERE  (Customer LIKE 'SomeCustomer') AND (DATEADD(Year, Year - 1900, DATEADD(Month, Month - 1, DATEADD(day, 0, 0))) <= DATEADD(Year, 2016 - 1900, DATEADD(Month, 5 - 1, DATEADD(day, 0, 0)))) 
GROUP BY Customer) AS Expr1, 
[Month] 
FROM OTRS_Revised.dbo.Months 
GROUP BY [Month] 

答えて

0
SELECT b.* 
    FROM 
    (SELECT  CASE WHEN [Year] < 2016 THEN 1 ELSE [Year] END AS [Year], CASE WHEN [Year] < 2016 THEN 0 ELSE [Month] END AS [Month] 
    FROM   [dbo].Months 
    WHERE  [Year] <= 2016 
    GROUP BY Year, Month 
    ORDER BY Customer, Year, Month) AS a 

LEFT OUTER JOIN 
    (SELECT  [Customer], CASE WHEN [Year] < 2016 THEN 1 ELSE [Year] END AS [Year], CASE WHEN [Year] < 2016 THEN 0 ELSE [Month] END AS [Month], [Closing] AS Total, SUM([Closing]) 
          OVER (PARTITION BY [Customer] ORDER BY [Year], [Month] ROWS UNBOUNDED PRECEDING) AS Closing 
    FROM   [dbo].[WU_Closing_View] 
    WHERE [Customer] IN ('CustomerList') 
    GROUP BY [Customer], [Year], [Month], [Closing]) AS b 
    ON a.Month = b.Month) 

の結果を得るためにこれを使用する方法を見つけることができません一致する月が削除されています。あなたにも決算の試合を持っていないヶ月をしたいので、あなたは右の外の使用は、すべての月を取得する加入

+0

こんにちは、残念ながら、私はdbo.Monthsの中に "Customer"カラムを持っていないので動作しません。(それらをすべて追加したり、テーブルを最新の状態に保つのは難しい)。最後に、データのない月はこのクエリでは表示されません –

0

何か、このおそらく

DECLARE @T TABLE (ID INT, ProductID INT, TrDate DATE,InOut VARCHAR(10),Amount INT) 
INSERT INTO @T VALUES 
(1 ,1, '2016-01-01', 'I', 100), 
(2 ,2, '2016-01-01', 'I', 100), 
(3 ,3, '2016-02-01', 'I', 100), 
(4 ,4, '2016-03-01', 'I', 100), 
(5 ,1, '2016-03-01', 'I', 100), 
(6 ,2, '2016-04-01', 'O', 10), 
(7 ,3, '2016-05-01', 'I', 100), 
(8 ,5, '2016-05-01', 'I', 100), 
(9 ,5, '2016-05-01', 'O', 100), 
(10 ,6, '2016-05-01', 'I', 100) 

declare @m table (id int, menddate date) 
insert @m values 
(1,'2015-12-31'),(2,'2016-01-31'),(3,'2016-02-29'),(4,'2016-03-31'), 
(5,'2016-04-30'),(6,'2016-05-31'),(7,'2016-06-30'),(4,'2016-07-31') 

Select * 
from 
(
select -- t.* 
     x.xproductid , x.xyyyymm, 
     SUM(t.total) OVER (partition by x.xproductid 
     ORDER BY x.xyyyymm 
      ROWS UNBOUNDED PRECEDING) AS CumulativeTotal 
from 
(
SELECT t.ProductID tproductid, year(t.trdate) * 100 + month(t.trdate) tyyyymm, 
     sum(case when t.Inout = 'I' then t.Amount else t.amount * -1 end) as total  
FROM @T t 
group by ProductID, year(t.trdate) * 100 + month(t.trdate) 
) t 
right outer join 
(select distinct productid as xproductid,year(m.menddate) * 100 + month(m.menddate) xyyyymm from @t t, @m m) x on x.xproductid = t.tproductid and x.xyyyymm = t.tyyyymm 

) z 
where z.xyyyymm >= 201601 
order by z.xProductID,z.xyyyymm 

ノートのように左外部結合を使用する必要がありますすべての製品の終わり

関連する問題