Проблема с суммой таблицы данных

У меня есть ситуация.

У меня есть данные, которые содержат столбцы кредита и дебета, подобные этому

Month     Credit     Debit
Sep       1422825      0
Oct         0        1422825
Oct       1695017.5    0
Nov         0         1400000
Nov         0         295018

Я хочу, чтобы баланс отображался вот так

Month     Credit     Debit       Balance
Sep       1422825      0
Oct         0        1422825      (1422825 of Credit-1422825 of Debit)=0
Oct       1695017.5    0
Nov         0         1400000     
Nov         0         295018       (1695017.5 of credit-1400000+295018)=0.5

в отчете о кристалле должно быть показано, как это сделать.


person Fahad Mirza    schedule 14.06.2013    source источник
comment
пожалуйста, помогите мне сделать это.   -  person Fahad Mirza    schedule 14.06.2013
comment
нужно показывать баланс только на конец месяца. Как и в случае с нояб. Или нужно показывать остаток в каждой строке.   -  person शेखर    schedule 14.06.2013
comment
Это проблема с текущими значениями. См. это. Было бы полезно, если бы вы указали версию SQL-сервера. Например, это для 2005.   -  person OzrenTkalcecKrznaric    schedule 14.06.2013
comment
Моя версия SQL 2008 года.   -  person Fahad Mirza    schedule 14.06.2013
comment
для Шекхара, да, мне нужен баланс каждый месяц, но перед дебетом.   -  person Fahad Mirza    schedule 14.06.2013
comment
Пожалуйста, смотрите обновленный ответ   -  person OzrenTkalcecKrznaric    schedule 14.06.2013


Ответы (1)


Вот ваше решение, оптимизированное для 2005 года, я уверен, что оно хорошо работает в 2008 году. (Используйте целое число для месяца, это проще...)

DECLARE @Temp TABLE (Month int, Credit money, Debit money, Balance money)

DECLARE @RunningTotal money

SET @RunningTotal = 0

INSERT INTO @Temp
SELECT Month, Credit, Debit, null
FROM Datatable
ORDER BY Month

UPDATE @Temp
SET @RunningTotal = Balance = @RunningTotal + Credit - Debit
FROM @Temp

SELECT * FROM @Temp

EDIT (это продолжается с первого шага):

Если вам нужно отобразить только последнюю запись в группе (месяц), вы можете использовать функцию ранжирования, например...

;WITH Temp2 AS
(
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY Month
            ORDER BY Credit DESC, Debit DESC -- whatever order inside group you need
        ) AS N
     FROM @Temp
)
SELECT
    Month,
    Credit, 
    Debit, 
    Balance = CASE WHEN N = 1 THEN Balance ELSE NULL END
FROM Temp2

Это не проверено, код написан прямо из моей головы: P

person OzrenTkalcecKrznaric    schedule 14.06.2013
comment
Уважаемый Озрен, Спасибо за ваш ответ. это действительно полезно, но дорогой, я не хочу получать промежуточную сумму, вместо этого я хочу текущий баланс каждого месяца. пожалуйста, просмотрите мой вопрос еще раз. Действительно, спасибо, да благословит вас Бог. - person Fahad Mirza; 14.06.2013
comment
Ваш вопрос выглядит так, как будто вам нужны все строки, а не одна строка в месяц. Если вам нужна одна строка в месяц, вы используете общую сумму + группу по месяцам. - person OzrenTkalcecKrznaric; 14.06.2013
comment
Уважаемый Озрен, могу ли я сделать это с помощью LINQ? - person Fahad Mirza; 14.06.2013
comment
Мирза, вопрос был не в этом, и я бы предложил открыть для этого еще один вопрос, если он еще не задан. Вы можете оценивать текущие значения с помощью LINQ, и здесь есть решение для SO: http://stackoverflow.com/questions/1834753/linq-to-sql-and-a-running-total-on-упорядоченныерезультаты. - person OzrenTkalcecKrznaric; 14.06.2013