sql server正在运行总计,条件为借贷余额

sql server正在运行总计,条件为借贷余额,sql,sql-server,Sql,Sql Server,我想根据下表中的借方和贷方金额计算总金额。有一列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'

我想根据下表中的借方和贷方金额计算总金额。有一列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
但我想知道最好的方法是什么


谢谢你,这很简单,你在对账单中使用“当charCrDr='c'时求和,然后decAmt else-decAmt按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
试试这个:改进的

说明:

案例将决定是否将十位数作为正数或负数添加到总和中。 分区意味着将分别为另一个答案中缺少的每个varName计算总和 ORDER BY将确保正确计算总和
这将适用于任何受支持的Sql Server版本2005和更高版本。

当我触发上述查询时,它会给出错误消息Msg 11305,级别15,状态10,第54行。并行数据仓库PDW功能未启用。请关闭但不关闭。您的结果与预期结果不一致。您使用的是哪个版本的SQL server?SQL server 2012,但没有问题,我已经解决了。非常感谢您在回答中没有使用varName的分区。这是一个关于如何以正确方式问SQL问题的很好示例:DDL+DML用于示例数据、所需输出,展示你的努力。你当然赢得了我的选票。
<%@ 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>
<%@ 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>