2015-02-28 7 views
1

Логика заключается в том, что я разрабатываю отчет с использованием SSRS. Проблема, с которой я столкнулся, состоит в том, что на одной таблице у меня есть поле «Сумма» (в данном случае столбец «A»), а другая таблица имеет сумму, подлежащую вычету (в данном случае столбцу «В»).SQL Server: вычесть соседнюю группу столбцов

Когда я показываю эти записи в отчете (ssrs), он отображается как следующий (первая таблица), но результат, который они ищут, является вторым.

Как это работает: колонна является результатом AB (6.000 - 2.000) за исключением первого, и этот результат (6,000 - 2.000 = 4.000) будет установлен на A.

Что я имею Сейчас:

id A  B  
----------------- 
1 6.000 2.000 
2 6.000 1.000 
3 6.000 2.000 
4 6.000 1.000 

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

id A  B  C 
------------------------- 
1 6.000 2.000 4.000 
2 4.000 1.000 3.000 
3 3.000 2.000 1.000 
4 1.000 1.000 0.000 
+0

Вы должны маркировать свой вопрос с базой данных, которую вы используете. И ваш результат не имеет смысла. Что случилось с десятичными знаками? Измените свой вопрос и объясните логику. –

ответ

0

Это должно работать. Я добавил ROW_NUMBER в случае наличия пробелов между идентификаторами. Если нет - просто проигнорируйте его и используйте поле id в этом сценарии.

DECLARE @data TABLE 
(
    id INT 
    , A FLOAT 
    , B FLOAT 
); 

INSERT INTO @data 
    (id, A, B) 
VALUES 
     (1, 6.000, 2.000) 
    , (2, 6.000, 1.000) 
    , (3, 6.000, 2.000) 
    , (4, 6.000, 1.000) 
    , (6, 5.000, 1.000); 

;WITH ordered (rn, id, A, B) 
AS (
    SELECT ROW_NUMBER() OVER(ORDER BY id) AS rn, id, A, B 
    FROM @data 
), 
cte 
AS (
    SELECT rn, id, A, B, A-B AS C 
    FROM ordered 
    WHERE rn = 1 

    UNION ALL 

    SELECT T.rn, T.id, C.C, T.B, C.C - T.B 
    FROM ordered AS T 
    INNER JOIN cte AS C 
     ON c.rn + 1 = T.rn 
) 
SELECT * 
FROM cte 

Дополнительные примеры с использованием аналитических функций:

;WITH ordered (previous_id, id, A, B) 
AS (
    SELECT LAG(id) OVER(ORDER BY id) , id, A, B 
    FROM @data 
), 
cte 
AS (
    SELECT previous_id, id, A, B, A-B AS C 
    FROM ordered 
    WHERE previous_id IS NULL 

    UNION ALL 

    SELECT T.previous_id, T.id, C.C, T.B, C.C - T.B 
    FROM ordered AS T 
    INNER JOIN cte AS C 
     ON c.id = T.previous_id 
) 
SELECT id, A, B, C 
FROM cte 

Выход:

rn id A B C 
------------------ 
1 1 6 2 4 
2 2 4 1 3 
3 3 3 2 1 
4 4 1 1 0 
5 6 0 1 -1 
+0

Спасибо. позвольте мне попробовать и вернуться к вам. –

+0

Я также добавил дополнительное решение, используя функцию LAG, возможно, вам понравится больше. –

Смежные вопросы