2016-06-29 5 views
0

Ich versuche, die verbleibende Anzahl von Arbeitseinheiten für jeden Monat zu erhalten, von einer Summe zwischen einer gekauften Anzahl von Arbeitseinheiten und einer verbrauchten Anzahl von Arbeitseinheiten.Berechnen Schließen (Summen von zwei Ansichten, einschließlich der Vergangenheit)

ich zwei Möglichkeiten ausprobiert, aber beide haben Fehler:

Im ersten Test habe ich eine „Monate“ Tabelle, die jeden Monat und jedes Jahr, um alle Monate in der endgültigen Matrix zu zeigen, enthält wünsche ich mit diesen Daten zu erstellen. Bei dieser Methode erhalte ich die Schließung, wenn eine verbrauchte Arbeitseinheit vorhanden ist, aber wenn nicht, ist die Spalte "leer", weil sie nicht die letzte Schließung erhält.

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 

Ich habe auch versucht, es "Monat für Monat", mit der folgenden Abfrage zu tun. Es funktioniert für einen Monat, aber ich kann keinen Weg finden, dies zu verwenden, um die Ergebnisse für jeden Monat des Jahres 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] 

Antwort

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) 

in Ihrem Ansatz zu erhalten, wenn Sie Union tun, um die Zeilen, der don Keine passenden Monate werden entfernt. Da Sie die Monate wollen die Schließung Spiel nicht so gut haben, müssen Sie die linke äußere

+0

Hallo, Leider funktioniert es nicht, weil ich keine "Kunden" -Spalte in dbo.Months habe (weil es schwierig wäre, sie alle hinzuzufügen und die Tabelle auf dem neuesten Stand zu halten). Am Ende werden Monate ohne Daten bei dieser Abfrage nicht angezeigt –

0

So etwas wie dieses vielleicht

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 

Hinweis Werden Sie Mitglied der Einsatz eines rechten Außen kommen alle um den Monat zu erhalten endet für alle Produkte

Verwandte Themen