[英]sql server running total with condition with debit credit balance
我想在下表中根據借方和貸方amt進行總計金額的計算,有一列drcr,其中“ c”代表貸方,“ d”代表借方,也應使用分組名稱來完成。
我想使用SQL Server查詢以下輸出
Name amt drcr Total
| 'abc'| 1| 'c'|1 |
| 'abc'| 5| 'd'|-4|
| 'abc'| 2| 'c'|-2|
| 'abc'| 1| 'c'|-1|
| 'bcd'| 1| 'c'|15|
| 'bcd'| 1| 'd'|0 |
| 'bcd'| 5| 'c'|5 |
| 'bcd'| 8| 'd'|-3|
| 'bcd'| 0| 'c'|-3|
從以下輸入
CREATE TABLE #temp
(
intId INT IDENTITY(1, 1) ,
varName VARCHAR(50) ,
decAmt DECIMAL(28, 0) ,
charCrDr CHAR(1) , -- c cr, d dr
decTotal DECIMAL(28, 0)
)
INSERT INTO #temp
( varName, decAmt, charCrDr )
VALUES ( 'abc', 1, 'c' ),
( 'abc', 5, 'd' ),
( 'abc', 2, 'c' ),
( 'abc', 1, 'c' ),
( 'bcd', 15, 'c' ),
( 'bcd', 15, 'd' ),
( 'bcd', 5, 'c' ),
( 'bcd', 8, 'd' ),
( 'bcd', 0, 'c' )
我已經使用以下解決方案解決了
SELECT *
INTO #temp1
FROM #temp AS T
UPDATE #temp1
SET #temp1.intAmt = CAST(-#temp1.decAmt AS DECIMAL)
WHERE charCrDr = 'd'
SELECT T.intId ,
T.varName ,
T.charCrDr ,
T.decAmt ,
SUM(T2.decAmt) AS balance
FROM #temp1 AS T
INNER JOIN #temp1 AS T2 ON T2.varName = T.varName
AND T2.intId <= T.intId
GROUP BY T.intId ,
T.varName ,
T.charCrDr ,
T.decAmt
但我想最好的方法是什么
感謝你
試試這個:(已改進 )
SELECT intId, varName, decAmt, charCrDr,
SUM(CASE WHEN charCrDr = 'c' THEN
decAmt
ELSE
decAmt * -1
END )
OVER (PARTITION BY varName ORDER BY intId) As decTotal
FROM #Temp;
說明:
CASE
將決定是否將decAmt作為正數或負數添加到SUM
。 PARTITION BY
表示將分別為每個varName計算總和(其他答案中缺少) ORDER BY
將確保總和正確計算 這將適用於任何受支持的Sql Server版本(2005及更高版本)。
HI Navnit這很簡單,您可以在語句中使用'Sum(charCrDr ='c'的情況,然后decAmt else -decAmt結尾)over(按intId排序)。
select *,Sum( case when charCrDr = 'c' Then decAmt else -1*decAmt end) over( PARTITION BY varName ORDER BY intId) as Total
from #temp t
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@page import="java.sql.*"%>
<%@ page import="java.util.Calendar" %>
<%
//java Code
String date = (new java.util.Date()).toString();
String UserName = request.getParameter("UserName");
String CusId= request.getParameter("CusId");
String AccountNo = request.getParameter("AccountNo");
String Debit = request.getParameter("Debit");
String Credit=request.getParameter("Credit");
String Balance=request.getParameter("Balance");
String sDate=request.getParameter("sDate");
try
{
String s="jdbc:odbc:Database1";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection(s);
Statement smt=conn.createStatement();
Calendar calendar = Calendar.getInstance();
java.sql.Date startDate = new java.sql.Date(calendar.getTime().getTime());
String sql= "SELECT sDate, (SUM(Debit)*-1) + SUM(Credit)Balance FROM abcbank GROUP BY sDate";
ResultSet result = smt.executeQuery(sql);
int count = 0;
while (result.next())
{
result.getString(1,"Debit");
result.getString(2,"Credit");
result.getString(3,"Balance");
result.getDate(4,startDate);
}
String update= "UPDATE abcbank SET Balance =Debit + Balance WHERE AccountNo="+AccountNo+" ";
PreparedStatement statement = conn.prepareStatement(update);
//statement.setString(1,"AccountNo");
int rowsUpdated = statement.executeUpdate();
if (rowsUpdated ==0)
{
out.println("This Emp does not Exists!");
}
else if(rowsUpdated ==1)
{
out.println("An existing user was updated successfully!");
}
conn.close();
}
catch(Exception ex)
{
System.err.println(ex.getMessage());
}
%>
</body>
</html>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.