Как ссылаться на вычисленное значение из предыдущей строки, чтобы найти следующее вычисленное значение - PullRequest
3 голосов
/ 03 октября 2019

Попытка вычислить новое поле на основе значений в таблице. После того, как первое поле вычислено, необходимо, чтобы следующие строки ссылались на предыдущее значение, чтобы начать следующий расчет.

Попытка использовать функции запаздывания / опережения, так как мне потребуется разделить.

declare @test as table (
[Worked Hours] decimal(2,0),
[Sold Hours] decimal(3,0),
[Current Backlog] decimal(3,0),
[Product] nvarchar(10),
[Revenue Type] nvarchar(3),
[Month] date
)

INSERT INTO @TEST 
([Worked Hours], [Sold Hours], [Current Backlog], [Product], [Revenue Type], [Month])

VALUES
('10','150','50', 'Product', 'Revenue', '01-01-2019'),
('25','200','50', 'Product', 'Revenue', '02-01-2019'),
('15','175','50', 'Product', 'Revenue', '03-01-2019'),
('40','250','50', 'Product', 'Revenue', '04-01-2019')


select 

t.[Product],
t.[Revenue Type],
t.[Month],
t.[Worked Hours],
t.[Sold Hours],
t.[Current Backlog]

from @test as T

Мой ожидаемый результатбудет новый столбец, который будет использовать эту математику.

T. [Текущее отставание] - T. [Рабочие часы] + T. [Проданные часы] = 'Новое отставание' (Для первой строки это будет190).

В следующей строке будет использоваться «Новое значение невыполненного задания» (190) в качестве замены T. [Текущее отставание] в предыдущем уравнении.

Overall Expected Results

Product Revenue 2019-01-01  10  150 50    190
Product Revenue 2019-02-01  25  200 50    365
Product Revenue 2019-03-01  15  175 50    525
Product Revenue 2019-04-01  40  250 50    735

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Я думаю, что вы хотите совокупную сумму:

select t.*,
       [Current Backlog] + sum([Sold Hours] - [Worked Hours]) over (order by [Month])
from @test t;

Здесь - это дб <> скрипка.

0 голосов
/ 03 октября 2019

Я бы подошел к этому с рекурсивным CTE. Вам нужно ранжировать и подсчитывать записи, а затем рекурсивно обрабатывать каждую запись, назначая новые значения невыполненных работ по мере продвижения.

Рассмотрим:

WITH 
tab AS (
    SELECT
        t.*,
        ROW_NUMBER() OVER(ORDER BY [Month]) rn,
        COUNT(*) OVER() cnt
    FROM @test t
),
cte AS (
    SELECT 
        [Product], 
        [Revenue Type],
        [Month],
        [Worked Hours],
        [Sold Hours],
        CAST([Current Backlog] as integer) 
            - CAST([Worked Hours] as integer) 
            + CAST([Sold Hours] as integer) [New Backlog],
        cnt,
        1 n
    FROM tab t
    WHERE t.rn = 1
    UNION ALL
    SELECT 
        t.[Product],
        t.[Revenue Type],
        t.[Month],
        t.[Worked Hours],
        t.[Sold Hours],
        c.[New Backlog] 
            - CAST(t.[Worked Hours] AS integer) 
            + CAST(t.[Sold Hours] AS integer) [New Backlog],
            t.cnt,
            c.n + 1
    FROM tab t
    INNER JOIN cte c ON t.rn = c.n + 1
    WHERE c.n <= t.cnt
)
SELECT 
    [Product],
    [Revenue Type],
    [Month],
    [Worked Hours],
    [Sold Hours],
    [New Backlog]
FROM cte;

Демонстрация в БДСкрипка :

Product | Revenue Type | Month               | Worked Hours | Sold Hours | New Backlog
:------ | :----------- | :------------------ | :----------- | :--------- | ----------:
BBCRM   | T&M          | 01/01/2019 00:00:00 | 10           | 150        |         190
BBCRM   | T&M          | 01/02/2019 00:00:00 | 25           | 200        |         365
BBCRM   | T&M          | 01/03/2019 00:00:00 | 15           | 175        |         525
BBCRM   | T&M          | 01/04/2019 00:00:00 | 40           | 250        |         735
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...