эффективный способ расчета баланса с помощью sql - запроса
каков самый быстрый/эффективный способ решить эту проблему?
Таблица: транзакция
ID user date deposit withdraw 1 A 2014-01-21 100 0 2 A 2014-01-21 0 30 3 A 2014-01-21 300 0 4 A 2014-01-23 0 20 5 B 2014-01-23 20 0
Ожидаемый результат: (фильтр по пользователю = 'A' и дате <= '2014-01-24')
Date B/F Deposit Withdraw Balance 2014-01-21 0 400 -30 370 2014-01-22 370 0 0 370 2014-01-23 370 0 -20 350 2014-01-24 350 0 0 350
Примечание: Первоначально я разработал базу данных транзакций, объединив "депозит" и "вывод" в "сумму" и добавив новое поле с именем "тип", где " D "указывает на "депозит", а " W "- на "вывод". Но я считаю, что это требует большего расчета, чтобы выйти с результатом.
Пожалуйста, поправьте меня, если я ошибся.
1. Какой дизайн базы данных является более эффективным?
2. Как насчет запроса? должен ли я выполнять вычисления внутри запроса?(Пожалуйста, предоставьте пример запроса, если это возможно) или я читаю строку за строкой и делаю расчет в коде позади? я использую c#, asp.net
_______________ОБНОВЛЕННЫЙ_________________________________________________
мне удалось занять первый ряд, как насчет остальных?
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { Label lblBF = (Label)e.Row.FindControl("lblBF"); Label lblDeposit = (Label)e.Row.FindControl("lblDeposit"); Label lblWithdraw = (Label)e.Row.FindControl("lblWithdraw"); Label lblTotal = (Label)e.Row.FindControl("lblTotal"); decimal d_bf = 0; // code to run query //"SELECT IFNULL(SUM(deposit- withdraw), 0) Balance FROM transaction WHERE date BETWEEN '2013-01-01' AND '2013-12-31'"); if (dataReader.Read()) { d_bf = Convert.ToDecimal(dr["balance"].ToString()); } ConnectionClose(); if (e.Row.RowType == DataControlRowType.DataRow) { if (e.Row.RowIndex == 0) //calculation for 1st row { lblBF.Text = d_bf.ToString(); lblTotal.Text = Convert.ToString(Convert.ToDecimal(lblBF.Text) + Convert.ToDecimal(lblDeposit.Text) - Convert.ToDecimal(lblWithdraw.Text)); } else //calculation for the rest { // how to get prev row/cell } if (lblWithdraw.Text != "0.00") { lblWithdraw.Text = "- " + lblWithdraw.Text; } } }
Suk@nta
их нет в колонке б/ф, которую вы упоминаете. можете ли вы написать, где вы получили
melvintcs
простите, я ошибся. Б/ф означает "переносит вперед", остаток предыдущего дня переносит на сегодняшний день. 21 января-это "0", потому что депозит еще не сохранен. 22 января-это "370" , потому что 100+300-30 на 21 января.
Suk@nta
проверьте решение 2