Как добавить исходную сумму самой старой транзакции в статистическую функцию?

Я пытаюсь выяснить, как включить исходный объем первой транзакции (самая старая по дате публикации) в совокупный запрос.

Следующее находит отмененные транзакции.

SELECT DISTINCT   
    [Account], [Voucher],
    [DocumentDate],
    SUM([Amount])   
FROM            
    MyTable 
WHERE           
    [Account] = 'abc'
GROUP BY
    [Account], [Voucher], [DocumentDate]
HAVING          
    SUM([Amount]) = 0

Как бы я включил сумму в результаты для транзакции с самой старой опубликованной датой для каждой записи?

Например, используя следующее:

Account   Voucher   DocumentDate   PostedDate   Amount
---------------------------------------------------------
abc         1       01/01/2018     08/01/2018    100.00
abc         1       01/01/2018     15/01/2018   -100.00 

Ожидаемый результат будет:

Account   Voucher   DocumentDate   OriginalAmount   Sum(Amount)   Records
-------------------------------------------------------------------------
abc          1      01/01/2018        100.00           0.00          2

2 ответа

Решение

Один из способов сделать это - использовать cte с first_value, sum...over а также count...over,

Сначала создайте и заполните образец таблицы (пожалуйста, сохраните этот шаг в ваших будущих вопросах)

DECLARE @T AS TABLE
(
    Account char(3),
    Voucher int,
    DocumentDate date,
    PostedDate date,
    Amount numeric(5,2)
)

INSERT INTO @T VALUES
('abc', 1, '2018-01-01', '2018-01-08', 100),
('abc', 1, '2018-01-01', '2018-01-15', -100)

The Cte:

;WITH CTE
AS
(
    SELECT  [Account], 
            [Voucher],
            [DocumentDate],
            FIRST_VALUE(Amount) OVER(PARTITION BY [Account], [Voucher], [DocumentDate] ORDER BY PostedDate) AS OriginalAmount,
            SUM([Amount]) OVER(PARTITION BY [Account], [Voucher], [DocumentDate]) AS [Sum(Amount)],
            COUNT(*) OVER(PARTITION BY [Account], [Voucher], [DocumentDate]) Records
    FROM            
        @T 
    WHERE           
        [Account] = 'abc'
)

Запрос:

SELECT DISTINCT *
FROM CTE 
WHERE [Sum(Amount)] = 0

Результаты:

Account     Voucher     DocumentDate            OriginalAmount  Sum(Amount)     Records
abc         1           01.01.2018 00:00:00     100,00          0,00            2

Смотрите живое демо на rextester.

Это кажется простым... я что-то упустил?

WITH CTE AS 
(
    SELECT 
        [Account], 
        [Voucher],
        [DocumentDate],
        ROW_NUMBER() OVER (PARTITION BY [Account],[Voucher] ORDER BY [DocumentDate]) RN,
        [Amount]
    FROM            
        MyTable 
    WHERE           
        [Account] = 'abc'
)
SELECT 
        [Account], 
        [Voucher],
        [DocumentDate],
        max(case when RN = 1 THEN [Amount] else null end) OriginalAmount,
        sum([Amount]) SUM_Amount,
        count(*) Records
from cte
GROUP BY
    [Account], [Voucher], [DocumentDate]
HAVING          
    SUM([Amount]) = 0
Другие вопросы по тегам