Подмножество строк с начальным и конечным балансом - PullRequest
0 голосов
/ 08 марта 2019

Работает на: SQL Server 2012

Я пытаюсь получить кол-во использования между счетами (с 1-го по 2-е ... 3-е ...), будь то высокий или низкий.Конечное сальдо первых трех транзакций установлено на 0, так как сальдо закрытия перешло в отрицательное значение.Если доступное сальдо доступно только, перейдите к следующей транзакции в качестве начального сальдо.

Пожалуйста, предоставьте все ваши ценные предложения и поддержку для улучшения результатов запроса.

Я пытаюсь получить результат, как указано ниже (формат Excel длятолько для иллюстрации).

enter image description here

Мой результат: enter image description here


DECLARE
@startDate DATETIME,
@endDate DATETIME,
@OpenBalance int

SET @startDate = '09/01/2018'
SET @endDate = '12/30/2018'

; WITH cteDates AS 
 (
  SELECT
   @startDate 'new_date',
   @startDate 'end_date',
   1 as level
  UNION ALL
  SELECT
   DATEADD(DD,1,new_date) 'new_date',
   DATEADD(DD,1,new_date),
   level+1
  FROM cteDates
  WHERE DATEADD(dd,1,new_date) < @endDate
 )
, cteInvoice AS
 (
  SELECT ProductID
  ,InvoiceNo
  ,InvoiceDate
  ,InvoiceQty
  ,LEAD(InvoiceDate) OVER (PARTITION BY ProductID ORDER BY InvoiceDate) AS 
   NextDate
 FROM ##tmpInvoice AS h
 JOIN cteDates ON InvoiceDate BETWEEN cteDates.new_date and 
 cteDates.end_date 
)
, cteUsage AS
 (
  SELECT ProductID, TransactionDate, Quantity
  FROM ##tmpUsage 
  JOIN cteDates ON TransactionDate BETWEEN cteDates.new_date and 
  cteDates.end_date
 )

SELECT cteInvoice.*
 ,o.UsageQty
 ,ROW_NUMBER() OVER (PARTITION BY 
  cteInvoice.ProductID,CteInvoice.InvoiceDate ORDER BY
cteInvoice.InvoiceNo) AS RowNumber 
FROM cteInvoice 
OUTER APPLY (SELECT SUM(Quantity) AS UsageQty  
             FROM cteUsage 
             WHERE (cteInvoice.ProductId = cteUsage.ProductID) 
              AND (TransactionDate >= cteInvoice.InvoiceDate 
              AND  TransactionDate < cteInvoice.NextDate)
             GROUP BY cteUsage.ProductID) AS o 
OPTION (MAXRECURSION 0); GO
...