Calculation in Sql Server

前端 未结 6 671
孤街浪徒
孤街浪徒 2021-01-31 02:21

I trying to perform following calculation

Sample data:

CREATE TABLE #Table1
  (
     rno   int identity(1,1),
     ccp   varchar(50),
          


        
6条回答
  •  囚心锁ツ
    2021-01-31 03:09

    This answer may be disappointing but you'll likely find that an iterative CLR approach performs competitively with any TSQL approach.

    Try the following (based on Running sums yet again: SQLCLR saves the day!)

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Data.SqlTypes;
    using Microsoft.SqlServer.Server;
    
    public partial class StoredProcedures
    {
        [Microsoft.SqlServer.Server.SqlProcedure]
        public static void StackoverflowQuestion41803909()
        {
            using (SqlConnection conn = new SqlConnection("context connection=true;"))
            {
                SqlCommand comm = new SqlCommand();
                comm.Connection = conn;
                comm.CommandText = @"
    SELECT [rno],
           [ccp],
           [col1],
           [col2],
           [col3],
           [col4]
    FROM   Table1
    ORDER  BY ccp,
              rno 
    ";
    
                SqlMetaData[] columns = new SqlMetaData[7];
                columns[0] = new SqlMetaData("rno", SqlDbType.Int);
                columns[1] = new SqlMetaData("ccp", SqlDbType.VarChar, 50);
                columns[2] = new SqlMetaData("col1", SqlDbType.Int);
                columns[3] = new SqlMetaData("col2", SqlDbType.Int);
                columns[4] = new SqlMetaData("col3", SqlDbType.Int);
                columns[5] = new SqlMetaData("col4", SqlDbType.Decimal, 17, 6);
                columns[6] = new SqlMetaData("result", SqlDbType.Decimal, 17, 6);
    
                SqlDataRecord record = new SqlDataRecord(columns);
    
                SqlContext.Pipe.SendResultsStart(record);
    
                conn.Open();
    
                SqlDataReader reader = comm.ExecuteReader();
    
                string prevCcp = null;
                decimal offset = 0;
    
                while (reader.Read())
                {
                    string ccp = (string)reader[1];
                    int col1 = (int)reader[2];
                    int col3 = (int)reader[4];
                    decimal col4 = (decimal)reader[5];
    
                    if (prevCcp != ccp)
                    {
                        offset = 0;
                    }
    
                    offset = ((col1 + offset) * (1 + col4));
                    record.SetInt32(0, (int)reader[0]);
                    record.SetString(1, ccp);
                    record.SetInt32(2, col1);
                    record.SetInt32(3, (int)reader[3]);
                    record.SetInt32(4, col3);
                    record.SetDecimal(5, col4);
                    record.SetDecimal(6, col3 - offset);
    
                    SqlContext.Pipe.SendResultsRow(record);
    
                    prevCcp = ccp;
                }
    
                SqlContext.Pipe.SendResultsEnd();
            }
        }
    };
    

提交回复
热议问题