none
Suma de Diagonal en una tabla

    Question

  • Lo que quiero sumar es el primer valor de A1, despues el 2°A1+1°A2, y asi sucesivamente, hasta el ultimo valor de A1+2°A2+1°A3.

    A1 A2 A3
    12.5 25 25
    30 30 30
    18 25 25
    Sum
    12.50
    55.00
    73.00
    Monday, January 21, 2013 6:53 PM

Answers

  • En mi opinión, este cálculo se resuelve mejor con una función tabular CLR. En T-SQL resulta muy farragoso para mi gusto y la solución propuesta sólo funciona con un número fijo para el tamaño del cuadrado.

    Aquí está el código de la función tabular:

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Data.SqlTypes;
    using Microsoft.SqlServer.Server;
    using System.Collections;
    using System.Globalization;
    
    public partial class UserDefinedFunctions
    {
        private class DiagonalResultRow
        {
            public int RowNumber;
            public double Value;
        }
        [SqlFunction(
            DataAccess=DataAccessKind.Read, 
            FillRowMethodName="FillDiagonalRow",
            TableDefinition="RowNumber int, Value float"
        )]
        public static IEnumerable GetDiagonals(string query)
        {
            using (var cn = new SqlConnection("context connection=true"))
            using (var cmd = new SqlCommand(query, cn))
            {
                cn.Open();
                using (var reader = cmd.ExecuteReader())
                {
                    int squareSideLength = reader.FieldCount;
                    var matrix = new double[squareSideLength, squareSideLength];
                    int rowIndex = 0;
                    while (reader.Read())
                    {
                        for (int columnIndex = 0; columnIndex < reader.FieldCount; columnIndex++)
                        {
                            object cellValueAsObject = reader.GetValue(columnIndex);
                            matrix[rowIndex, columnIndex]  = cellValueAsObject == DBNull.Value ? 0.0 
                                :((IConvertible)cellValueAsObject).ToDouble(CultureInfo.InvariantCulture);
                        }
                        rowIndex++;
                        if (rowIndex > squareSideLength)
                        {
                            throw new ArgumentException("La consulta no devuelve un cuadrado, no tiene el mismo número de filas que de columnas");
                        }
    
                    }
                    var resultSet = new DiagonalResultRow[squareSideLength];
                    for (int i = 0; i < squareSideLength; i++)
                    {
                        var row = new DiagonalResultRow 
                        {
                           RowNumber = i + 1
                        };
                        for (int j = 0; j <= i; j++)
                        {
                            row.Value += matrix[i - j, j];
                        }
                        resultSet[i] = row;
                    }
                    return resultSet;
                }
            }
        }
        public static void FillDiagonalRow( object row, out SqlInt32 rowNumber, out SqlDouble value)
        {
            var diagonalRow = (DiagonalResultRow) row;
            rowNumber = new SqlInt32(diagonalRow.RowNumber);
            value = new SqlDouble(diagonalRow.Value);
        }
    
    };
    

    Y aquí un ejemplo de su uso:

    CREATE TABLE #Square(
    	C1 float,
    	C2 float,
    	C3 float,
    	C4 float,
    	C5 float
    )
    INSERT INTO #Square
    VALUES 
    (3.5,7.5,7.3,7.1,3.8),
    (8.4,17.1,16.5,15.5,9.4),
    (4.5,8.7,8.0,7.9,3.9), 
    (4.7,10.2,10.1,10.1,5.2),
    (4.4,8.7,8.7,8.3,3.9) 
    
    SELECT * FROM dbo.GetDiagonals('SELECT * FROM #Square')
    
    DROP TABLE #Square

    Lo que produce el siguiente resultado:

    RowNumber	Value
    1			3,5
    2			15,9
    3			28,9
    4			37
    5			41,9


    Sunday, April 21, 2013 9:15 AM

All replies

  • Lo veo esto más fácil en visual basic guardándolo en un datagrid


    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com

    Monday, January 21, 2013 10:37 PM
  • No se usar Visual con SQL
    Tuesday, January 22, 2013 4:24 PM
  • postea tus avances para ir ayudandote, saludos, con visual se haria recorriendo los campos en el datagrid, saludos

    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    Tuesday, January 22, 2013 4:59 PM
  • No tengo avance, lo que se me ocurre es usar un contador con las columnas y que avance pero no sabria recorrerlo para arriba y tampoco como llamar una columna con una variable, lo de VB, no lo descarto pero tengo la menor idea de como hacerlo con VB
    Tuesday, January 22, 2013 5:10 PM
  • pues en sql lo veo algo complicado pero no imposible, creo que podrias usar group by particion, pero te confieso que no se muy bien, otra pregunta, solo esos campos vas a sumar?? o pueden cambiar?? en visual basic la logica seria asi:

    supongamos que tienes tu conexion con la bd, entonces lo unico que harias seria llenar un datatable y luego ponerselo al datagrid,

    una vez hecho esto podriamos poner un boton que se llame mostrar resultado, al darle clic esto seria lo que se podria hacer,

    bueno acabo de ver tu problema bien bien y no lo entiendo del todo sobre todo en esta parte:

    asi sucesivamente hasta el ultimo valor,

    saludos, esplica bien bien tu problema


    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    Tuesday, January 22, 2013 6:49 PM
  • Te lo pongo con Formatos.

    lo que quiero que resulte es la parte de abajo(SUM):

    (como posiciones) seria

    1,A1.

    2,A1+1,A2

    3,A1+2,A2+1A3

    A1 A2 A3
    12.5 25 25
    30 30 30
    18 25 25
    Sum
    12.50
    55.00
    73.00
    Tuesday, January 22, 2013 7:15 PM
  • correcto te soy sincero en sql no tengo idea de como hacerlo, seria cursores mezclado con otro tipo de logica, pero en programacion si se podria hacer, tengo unas preguntas,

    solo esas filas que expones se tienen que sumar, o son mas? saludos


    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    Tuesday, January 22, 2013 7:23 PM
  • es un cuadro de 24x24, pero ya sabiendo como se hace para tres lo aplico para los 24. El punto es de que es cuadrado

    Tuesday, January 22, 2013 7:25 PM
  • ok, pongamos un ejemplo de 4

          a     b     c     d 

     1 400 300 456 301

     2 300 400 500 600

     3 490 550 643 100

     4 500 632 743 300

    primer resultado : a1

    segundo: a2 + b1

    tercero : a3 + b2 + c1

    cuarto a4 + b3 + c2+ d1

    mi pregunta es cuando se llegue a la ultima fila, en este caso a4 alli termina la suma???

    o sigue con b4 + c3 + d2???? saludos


    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    • Marked as answer by Ricardo RussoModerator Monday, January 28, 2013 12:10 PM
    • Unmarked as answer by R-2 Monday, February 11, 2013 9:08 PM
    Tuesday, January 22, 2013 7:53 PM
  • Hola.

    Pásanos script de la creación de la tabla y datos de ejemplo. Una matriz no es el aspecto típico de una tabla en un modelo relacional. De todos modos, hay formas de resolverlo. En tu sentencia, para cada campo resultante (cada diagonal), creas un campo, donde sumas, en función del ordinal, el campo en cuestión, como sugiere novato_24. Algo tedioso, pero no difícil.

    Si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    Sunday, January 27, 2013 9:47 AM
    Moderator
  • no como dice el cuatro es el ultimo, y ano seria suma de las diagonales inferiores.

    es decir para ese de 4x4, solo seran el reultado asi

    ID      SUMA

    1         a1

    2       a2 + b1

    3        a3 + b2 + c1

    4        a4 + b3 + c2+ d1

    ese seria mi reultado final.

    para una de 24x24, seria una tabla con 24 valores.

          
    Monday, February 11, 2013 9:05 PM
  • ya tiene rato que no contestabas, tenia una forma de hacerlo pero se me olvido esta es otra forma que hice rapido ahora, no es la mejor, pero soluciona tu problema

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    namespace recorredatagridMSDN
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                // aqui en el load creamos las columnas que tendra nuestro datagrid para este ejemplo
                // seran 24
                int i = 0;
                dataGridView1.ColumnCount = 24;
                for (i = 0; i < 24; i++)
                {
                    // recorreos y asignamos nombre y le insertamos datos
                    dataGridView1.Columns[i].Name = "columna " + i.ToString();
                    dataGridView1.Rows.Insert(i, "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21","22","23");
                }
            }
            private void button1_Click(object sender, EventArgs e)
            {
                int i =0;
                int ValorCelda = 0, Resultado;
                // aqui recorremos el datagrid en base a la cantidad de columnas (24)
                for (i = 0; i < dataGridView1.Columns.Count; i++)
                {
                    Resultado = 0;
                    // hacemos un switch
                   switch(i)
                   {             
                       case 0:
                           // cuando es cero siempre solo tomara la primera fila y columna [0,0];
                           Resultado = Convert.ToInt32(dataGridView1.Rows[i].Cells[i].Value);
                           // insertamos en nuestro listbox el resultado
                           listBox1.Items.Add(Resultado.ToString());                
                           break;              
                       case 1:  
                           // apartir de 1 o mas ya se usa esta operacion, 
                           // hacemos un for con el valor de i
                           for(int a = 0;a<=i;a++)
                           {
                               // siempre que nuestra variable a sea = 0,
                               // nuestra variable valorcelda tomara el valor de i
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   // cuando nuestra variable a sea mayor a cero
                                   // valor de celda (que su valor es i decrementara)
                                   // por que conforme aumente la cantidad de rows de a
                                   // la cantidad de valorde celda debe decrementar 
                                   // para hacer el efecto de linea inclinada que buscas
                                   ValorCelda--;
                               }
                               // resultado sera la suma de todos nuestro recorridos
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                               
                           }
                           // asignamos el valor de resultado al listbox
                           listBox1.Items.Add(Resultado.ToString());                  
                               break;     
             
                           // y eso seria todo este metodo del case 1 sirve para los 24 columnas
                           // lo unico que no me gusta es que tienen que ser 24 switch, pero 
                           // con el mismo metodo no varia en nada, repito solo lo mano de tener
                           // que poner 24 swtich, este ejemplo lo puedes hacer con matrizes bidimensionales
                           // o cargar los datos del datagrid desde una base de datos funciona con todo
                           
                       case 2:
                               for(int a = 0;a<=i;a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                              
                           }
                               listBox1.Items.Add(Resultado.ToString());                 
                           break;              
                       case 3:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                              
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 4:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 5:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 6:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 7:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 8:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 9:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 10:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 11:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 12:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 13:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 14:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 15:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 16:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 17:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 18:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 19:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 20:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 21:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       case 22:
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break;
                       default:
                       
                           for (int a = 0; a <= i; a++)
                           {
                               if (a == 0)
                               {
                                   ValorCelda = i;
                               }
                               else
                               {
                                   ValorCelda--;
                               }
                               Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                           }
                           listBox1.Items.Add(Resultado.ToString());
                           break; 
                   }
                } 
            }
        }
    }

    ese es el codigo en c# para hacerlo si nesesitas convertirlo a  visual basic puedes ir aqui

    te anexo una imagen del programa en ejecucion y los 24 resultados.

    si alguien aporta una idea mejor, o algo mucho mejor sera bien recibido, esta es mi forma de hacerlo desde programacion, lo unico que no me gusto fueron los 24 switch, pero el codigo en cada uno de ellos es el mismo, saludos espero te sirva, nos cuentas!


    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    Monday, February 11, 2013 11:25 PM
  • se ve que si funciona, pero yo lo ocupo para SQL Server 2008
    Tuesday, February 12, 2013 5:37 PM
  • pero no dijiste que lo podias hacer en visual basic o c#??

    como puse entre los comentarios de codigos, la forma de llenar el datagrid lo puedes hacer desde un array, manual o desde una base de datos sql server, mi pregunta es tiene que ser todo hecho en sql server o sql server solo sera el contenedor de informacion, saludos


    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    Tuesday, February 12, 2013 6:12 PM
  • CASI:

    lo de VB, no lo descarto pero tengo la menor idea de como hacerlo con VB.

    Es decir no se usar SQL desde VB, no lo tengo que tener todo hecho en sql server, lo que si es que por lo menos el resultado lo saque de ahi.

    Tuesday, February 12, 2013 6:45 PM
  • ok, te dejo este link que te servira mucho

    conectar vb con sql server y llenar datagrid

    una vez hecho esto me imagino que ya tienes la estructura de tu tabla no?, si no pues harias esto

    -- creamos la tabla
    CREATE TABLE MITABLA24X24 (columna1 int,columna2 int,columna3 int,columna4 int,columna5 int,columna6 int,columna7 int,columna8 int,columna9 int,columna10 int,columna11 int,columna12 int,columna13 int,columna14 int,columna15 int,columna16 int,columna17 int,columna18 int,columna19 int,columna20 int,columna21 int,columna22 int,columna23 int,columna24 int);
    -- insertas los valores
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    solo seria que vieras el enlace que di de como conectar una bd a vb y luego poner los metodos y listo, saludos, si no te sirve ( :s ) postea los avances que lleves y vemos como te podemos ayudar mejor, saludos compañero

    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    Wednesday, February 13, 2013 2:48 PM
  • hola, acabo de modificar el codigo y mejoro en dos puntos:

    1.- mucho menos codigo.

    2.- completamente dinamico a que me refiero con esto que pueden ser cualquier cantidad de filas y columnas desde 4 hasta 24 o 48 etc, checalo ya mas facil creo que no se puede saludos

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    namespace recorredatagridMSDN
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                // aqui en el load creamos las columnas que tendra nuestro datagrid para este ejemplo
                // seran 24
                int i = 0;
                dataGridView1.ColumnCount = 24;
                for (i = 0; i < 24; i++)
                {
                    // recorreos y asignamos nombre y le insertamos datos
                    dataGridView1.Columns[i].Name = "columna " + i.ToString();
                    dataGridView1.Rows.Insert(i, "0", "1", "2", "3", "4","5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21","22","23");
                }
            }
            private void button1_Click(object sender, EventArgs e)
            {
                int i =0;
                int ValorCelda = 0, Resultado;
                // aqui recorremos el datagrid en base a la cantidad de columnas (24)
                for (i = 0; i < dataGridView1.Columns.Count; i++)
                {
                    Resultado = 0;
                    //if (i == i)
                    //{
                        // apartir de 1 o mas ya se usa esta operacion, 
                        // hacemos un for con el valor de i
                        for (int a = 0; a <= i; a++)
                        {
                            // siempre que nuestra variable a sea = 0,
                            // nuestra variable valorcelda tomara el valor de i
                            if (a == 0)
                            {
                                ValorCelda = i;
                            }
                            else
                            {
                                // cuando nuestra variable a sea mayor a cero
                                // valor de celda (que su valor es i decrementara)
                                // por que conforme aumente la cantidad de rows de a
                                // la cantidad de valorde celda debe decrementar 
                                // para hacer el efecto de linea inclinada que buscas
                                ValorCelda--;
                            }
                            // resultado sera la suma de todos nuestro recorridos
                            Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value);
                        }
                        // asignamos el valor de resultado al listbox
                        listBox1.Items.Add(Resultado.ToString());
                   }
                } 
            }
        }

    anexo la imagen en tiempo de ejecucion,

    como te comento ahora es completamente dinamico, lo probe con cuadrado de 4x4, 5x5 y 8x8 ahora es cuestion de que lo testees , conectes el grid con vb y listo, saludos compañero


    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    Wednesday, February 13, 2013 3:08 PM
  • te sirvio para resolver tu duda??


    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    Monday, February 18, 2013 10:24 PM
  • no lo he podido ligar a VB
    Tuesday, February 19, 2013 7:46 PM
  • que no has podido ligar?? postea tus avances para ayudarte, lo unico que se tendria que modificar al codigo es que eb vez de cargar el datagrid manual, lo cargues con una bd, y listo, oncluso ya pegue unos script en sql server de las tablas y los datos de cada una.

    es mas aqui te dejo un video de como conectar una bd sql a vb y mostrar los resultados es un datagrid, compañero

    conectar sql server a vb!

    nos comentas como te fue, saludos


    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    Tuesday, February 19, 2013 9:10 PM
  • lo voy a realizar con un dinamico, solo que no se como pasar el valor del SQLdinamico a una variable
    Wednesday, February 20, 2013 9:32 PM
  • con un contador?? en sql alli si no te podre ayudar mucho amigo, postea avances de todos modos para apoyarte saludos.

    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    Thursday, February 21, 2013 3:51 PM
  • Este es el query, el contador despues cambiara con un for, esto es una prueba hasta que funcione:

    DECLARE @sql nvarchar(500)
    DECLARE @ParmDefinition nvarchar(500)
    DECLARE @Dim float
    DECLARE @Count varchar
    SET @Count = '1' 	
    
    SET @sql = N'SELECT A'+@Count+' FROM	tbl'
    SET @ParmDefinition = N'@Dim float OUTPUT'
    
    EXECUTE sp_executesql @sql, @ParmDefinition, @Dim=@Dim OUTPUT;
    
    SELECT @Dim;
    El EXEC jala bien pero no se donde guarda el valor de resultado, segunyo en la variable @dim pero aparece nula
    Thursday, February 21, 2013 3:55 PM
  • hola aqui te dejo el script de como ligar tu tabla con un programa c#,

    te creas un proyecto nuevo, y en el form pones este datatable

    public DataTable cargarGrid()
            {
                DataTable dt1 = new DataTable();
                dt1.Clear();
                sql = "tu select de tu tabla";
                da = new SqlDataAdapter(sql, "tu cadena de conexion");
                da.Fill(dt1);
                return dt1;
            }

    declaras estas variables

            string sql;
            SqlDataAdapter da = new SqlDataAdapter();

    uego en el evento load de tu formulario pones lo siguiente

    cargarGrid();

    ya con esto llenas el datagrid como muestro en la imagen, una vez hecho esto lo unico que tienes que hacer es agregar el datagrid y el listo ( y los demas controles que vez en la imagen) el codigo quedaria asi (completo)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace recorredatagridMSDN { public partial class Form1 : Form { public Form1() { InitializeComponent(); }

    string sql;
            SqlDataAdapter da = new SqlDataAdapter();

    private void Form1_Load(object sender, EventArgs e) { // aqui en el load creamos las columnas que tendra nuestro datagrid para este ejemplo // seran 24 cargarGrid(); }

    public DataTable cargarGrid()
            {
                DataTable dt1 = new DataTable();
                dt1.Clear();
                sql = "tu select de tu tabla";
                da = new SqlDataAdapter(sql, "tu cadena de conexion");
                da.Fill(dt1);
                return dt1;
            } private void button1_Click(object sender, EventArgs e) { int i =0; int ValorCelda = 0, Resultado; // aqui recorremos el datagrid en base a la cantidad de columnas (24) for (i = 0; i < dataGridView1.Columns.Count; i++) { Resultado = 0; //if (i == i) //{ // apartir de 1 o mas ya se usa esta operacion, // hacemos un for con el valor de i for (int a = 0; a <= i; a++) { // siempre que nuestra variable a sea = 0, // nuestra variable valorcelda tomara el valor de i if (a == 0) { ValorCelda = i; } else { // cuando nuestra variable a sea mayor a cero // valor de celda (que su valor es i decrementara) // por que conforme aumente la cantidad de rows de a // la cantidad de valorde celda debe decrementar // para hacer el efecto de linea inclinada que buscas ValorCelda--; } // resultado sera la suma de todos nuestro recorridos Resultado += Convert.ToInt32(dataGridView1.Rows[a].Cells[ValorCelda].Value); } // asignamos el valor de resultado al listbox listBox1.Items.Add(Resultado.ToString()); } } }

    importante que agregues el using System.Data.SqlClient;

    ya con esto esta ligado y te funciona, se que esta en c# pero hay mucho traductores a vb, y no son muy distintos los lengujaes, ademas de que no te noto muy convencido por esta forma, es genial si encuentras la forma de hacerlo por sql, pero este igual es una buena forma de resolver el problema, ya mas no puedo hacer compañero, saludos


    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.


    • Edited by EddieMontana24 Friday, February 22, 2013 5:14 PM no cambie variables del ultimo script
    Friday, February 22, 2013 5:06 PM
  • Msg 156, Level 15, State 1, Line 2

    Incorrect syntax near the keyword 'public'.

    Msg 178, Level 15, State 1, Line 23

    A RETURN statement with a return value cannot be used in this context.

    Friday, February 22, 2013 6:59 PM
  • amigo en que parte estuvo el error?? que partes modificaste?? o solo pegaste, ya probe el codigo y no falla, podrias plantear un poco mejor el error, que no puedo adivinarlo, saludos

    - me di cuenta y falta una ultima llave de cierre en el codigo llave de cierre " } ", si te interesa hacerlo desde programacion postea tus avances y con gusto te ayudo, esto no es nada del otro mundo, lo dificil ya esta hecho (calcular los totales) ahora bien, no hay pretextos para no intentar investigar un poco de internet como unir sql server con vb, solo hay que hecharle un poco de ganas, ojo este no es un coment desctructivo, si no uno constructivo, postea tus avances y te ayudamos, saludos  

    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.


    Friday, February 22, 2013 7:39 PM
  • no como dice el cuatro es el ultimo, y ano seria suma de las diagonales inferiores.

    es decir para ese de 4x4, solo seran el reultado asi

    ID      SUMA

    1         a1

    2       a2 + b1

    3        a3 + b2 + c1

    4        a4 + b3 + c2+ d1

    ese seria mi reultado final.

    para una de 24x24, seria una tabla con 24 valores.

          

    Hola.

    Veo que hemos perdido un poco el rumbo con esta cuestión. Así que me remonto al punto que cito para tratar de reconducirlo. Aunque se puede hacer, no hay ninguna necesidad de emplear VB, se puede hacer con t-SQL, que para eso este foro es de SQL Server, y ni mucho menos hay que emplear SQL dinámico para resolver el problema. Como ya comenté, es únicamente tedioso, pero nada más. Veo que ya sabes cómo realizar el cálculo de 4 de los campos, ¿qué te impide seguir esa línea hasta los 24 que conforman la diagonal completa?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    Saturday, February 23, 2013 4:12 PM
    Moderator
  • eSTOY DE ACUERDO CONTIGO, YO NO LO QUIERO REALIZAR EN vb, NO LO SE UTILIZAR, USE EL SQL DINAMICO PARA QUE EL WHILE SE MOVIERA EN COLUMNAS, SI HAY OTRA FORMA DE MOVERSE EN COLUMNAS ES BIEN RECIBIDA, ESTOY EN EL PUNTO INICIAL, YA QUE EL EXECUTE PROCEDURE NO FUNCIONA DENTRO DE UNA FUNCION, ASI QUE SI TU CONOCES UNA FORMA DE SUMAR DE MANERA DIAGONAL EN SQL O T-SQL, TE LO AGRADECERIA.

    SALUDOS

    Monday, February 25, 2013 5:28 PM
  • Hola.

    No entiendo. Sólo hay que extender para todas las columnas lo que ya sabes hacer para 4. ¿Qué es lo que no consigues?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    Sunday, March 03, 2013 10:50 AM
    Moderator
  • no lo tengo ni para 4, yo se que si lo tengo para cuatro lo puedo extender, pero no tengo la forma de hacerlo.

    no hay nada todavia, hay una forma que tengo pero no puedo usar EXEC en funciones entonces no jalo.

    SAludos

    Friday, March 08, 2013 3:56 PM
  • Hola.

    Se puede hacer de esta manera (tomo como punto de partida el esquema y los datos de ejemplo que dejó otro usuario, tú no nos has proporcionado los tuyos):

    /*
    -- creamos la tabla
    CREATE TABLE MITABLA24X24 (columna1 int,columna2 int,columna3 int,columna4 int,columna5 int,columna6 int,
    columna7 int,columna8 int,columna9 int,columna10 int,columna11 int,columna12 int,columna13 int,columna14 int,
    columna15 int,columna16 int,columna17 int,columna18 int,columna19 int,columna20 int,columna21 int,columna22 int,
    columna23 int,columna24 int);
    -- insertas los valores
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    insert into MITABLA24X24 values (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
    
    */
    ;with cte as (select ROW_NUMBER() over (order by columna1) as ID , * from MITABLA24X24)
    
    select
    D1 = sum(case when ID = 1 then columna1 else 0 end),
    D2 = sum(case when ID = 2 then columna1 else 0 end + case when ID = 1 then columna2 else 0 end),
    D3 = sum(case when ID = 3 then columna1 else 0 end + case when ID = 2 then columna2 else 0 end + case when ID = 1 then columna3 else 0 end),
    D4 = sum(case when ID = 4 then columna1 else 0 end + case when ID = 3 then columna2 else 0 end + case when ID = 2 then columna3 else 0 end + case when ID = 1 then columna4 else 0 end)
    -- y así con el resto
    from cte

    Si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    Saturday, March 09, 2013 6:52 AM
    Moderator
  • Hola.

    Observo que aún no has logrado resolver el problema y que lo que te propuso tampoco te sirve. Sin embargo, no indicas en qué punto te encuentras ni por qué no te sirve.

    ¿Puedes decirnos el punto en el que estás ahora mismo y si podemos ayudarte?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    Monday, March 25, 2013 7:56 AM
    Moderator
  • he intentado lo que prpones, pero no me funciono, como te mencione estoy desde cero de nuevo, ya que no pude utilizarlo mediante funciones
    Wednesday, March 27, 2013 5:31 PM
  • Hola. ¿Qué no te funcionó? ¿A qué funciones te refieres? Aunque hayas empezado de cero, en algún punto estarás. ¿Podemos ayudar?

    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    Wednesday, March 27, 2013 5:49 PM
    Moderator
  • en que punto no te funciono R-2??, por que el ejemplo que pone el sr. qwalgrande es muy buena, postea tus avances,saludos

    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    Wednesday, March 27, 2013 7:00 PM
  • ya lo hice y no funciono del todo bien

    este es el resultado

    D1	D2	 D3 	 D4 	 D5 
    3.1	10.4	17.6	22.3	21.8
    

    este es el cuadro que use
     3.5 	 7.5 	 7.3 	 7.1 	 3.8 
     8.4 	 17.1 	 16.5 	 15.5 	 9.4 
     4.5 	 8.7 	 8.0 	 7.9 	 3.9 
     4.7 	 10.2 	 10.1 	 10.1 	 5.2 
     4.4 	 8.7 	 8.7 	 8.3 	 3.9 
     6.2 	 12.3 	 12.2 	 10.0 	 4.0 
     3.8 	 6.8 	 6.0 	 5.7 	 3.0 
     5.0 	 10.4 	 9.7 	 9.2 	 3.3 
     4.4 	 8.9 	 9.0 	 8.3 	 4.0 
     4.4 	 9.3 	 8.7 	 7.9 	 4.3 
     3.3 	 6.2 	 5.6 	 5.7 	 2.8 
     3.7 	 7.5 	 7.2 	 6.9 	 3.6 
     4.9 	 9.9 	 9.8 	 9.2 	 4.2 
     4.3 	 9.3 	 8.9 	 8.0 	 4.3 
     3.3 	 6.1 	 5.7 	 5.3 	 2.6 
     3.7 	 7.0 	 6.2 	 6.0 	 3.2 
     7.2 	 11.7 	 11.6 	 11.2 	 7.6 
     4.2 	 9.8 	 8.8 	 8.2 	 3.4 
     4.6 	 7.8 	 7.0 	 6.7 	 3.0 
     3.1 	 7.2 	 6.1 	 6.0 	 3.5 
     6.6 	 15.2 	 15.3 	 14.3 	 8.3 
     4.7 	 10.7 	 10.4 	 9.5 	 5.3 
     4.0 	 7.5 	 6.9 	 6.9 	 3.4 
     3.2 	 7.1 	 6.7 	 6.7 	 3.8 
    


    Monday, April 01, 2013 11:16 PM
  • Hola.

    Está claro que algo no estamos entendiendo, ya que si ese es el cuadro y para "D1", que es exclusivamente la primera de las celdas, no sé cómo es posible que obtengas "3.1", en lugar de "3.5". Y más aún, no se entiende que ahora tu cuadro tenga 5 columnas por fila, en lugar de las 24 que se presuponían.

    ¿Qué sentencia estás usando? ¿Puedes facilitarnos un script con la inserción de los datos de tu cuadro?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    Thursday, April 04, 2013 9:00 PM
    Moderator
  • insert into MITABLA24X24 values (3.5,7.5,7.3,7.1,3.8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (8.4,17.1,16.5,15.5,9.4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (4.5,8.7,8,7.9,3.9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (4.7,10.2,10.1,10.1,5.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (4.4,8.7,8.7,8.3,3.9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (6.2,12.3,12.2,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (3.8,6.8,6,5.7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (5,10.4,9.7,9.2,3.3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (4.4,8.9,9,8.3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (4.4,9.3,8.7,7.9,4.3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (3.3,6.2,5.6,5.7,2.8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (3.7,7.5,7.2,6.9,3.6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (4.9,9.9,9.8,9.2,4.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (4.3,9.3,8.9,8,4.3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (3.3,6.1,5.7,5.3,2.6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (3.7,7,6.2,6,3.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (7.2,11.7,11.6,11.2,7.6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (4.2,9.8,8.8,8.2,3.4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (4.6,7.8,7,6.7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (3.1,7.2,6.1,6,3.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (6.6,15.2,15.3,14.3,8.3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (4.7,10.7,10.4,9.5,5.3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (4,7.5,6.9,6.9,3.4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    insert into MITABLA24X24 values (3.2,7.1,6.7,6.7,3.8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    

    use lo que pusiste

    los demas eran cero

    Friday, April 05, 2013 5:44 PM
  • Hola.

    Todo el problema viene derivado de que el orden de los registros es importante. Agrega un identity a la tabla MITABLA24x24 que se llame Ident (por ejemplo), cambia también los tipos de datos de entero a numeric (5,2), inserta los registros de forma ordenada y luego, en la sentencia para recuperarlos, cambia lo siguiente:

    En lugar de esto:

    ;with cte as (select ROW_NUMBER() over (order by columna1) as ID , * from MITABLA24X24)


    Por esto otro:

    ;with cte as (select ROW_NUMBER() over (order by Ident) as ID , * from MITABLA24X24)

    Si con eso no lo resuelves, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    Sunday, April 21, 2013 7:21 AM
    Moderator
  • En mi opinión, este cálculo se resuelve mejor con una función tabular CLR. En T-SQL resulta muy farragoso para mi gusto y la solución propuesta sólo funciona con un número fijo para el tamaño del cuadrado.

    Aquí está el código de la función tabular:

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Data.SqlTypes;
    using Microsoft.SqlServer.Server;
    using System.Collections;
    using System.Globalization;
    
    public partial class UserDefinedFunctions
    {
        private class DiagonalResultRow
        {
            public int RowNumber;
            public double Value;
        }
        [SqlFunction(
            DataAccess=DataAccessKind.Read, 
            FillRowMethodName="FillDiagonalRow",
            TableDefinition="RowNumber int, Value float"
        )]
        public static IEnumerable GetDiagonals(string query)
        {
            using (var cn = new SqlConnection("context connection=true"))
            using (var cmd = new SqlCommand(query, cn))
            {
                cn.Open();
                using (var reader = cmd.ExecuteReader())
                {
                    int squareSideLength = reader.FieldCount;
                    var matrix = new double[squareSideLength, squareSideLength];
                    int rowIndex = 0;
                    while (reader.Read())
                    {
                        for (int columnIndex = 0; columnIndex < reader.FieldCount; columnIndex++)
                        {
                            object cellValueAsObject = reader.GetValue(columnIndex);
                            matrix[rowIndex, columnIndex]  = cellValueAsObject == DBNull.Value ? 0.0 
                                :((IConvertible)cellValueAsObject).ToDouble(CultureInfo.InvariantCulture);
                        }
                        rowIndex++;
                        if (rowIndex > squareSideLength)
                        {
                            throw new ArgumentException("La consulta no devuelve un cuadrado, no tiene el mismo número de filas que de columnas");
                        }
    
                    }
                    var resultSet = new DiagonalResultRow[squareSideLength];
                    for (int i = 0; i < squareSideLength; i++)
                    {
                        var row = new DiagonalResultRow 
                        {
                           RowNumber = i + 1
                        };
                        for (int j = 0; j <= i; j++)
                        {
                            row.Value += matrix[i - j, j];
                        }
                        resultSet[i] = row;
                    }
                    return resultSet;
                }
            }
        }
        public static void FillDiagonalRow( object row, out SqlInt32 rowNumber, out SqlDouble value)
        {
            var diagonalRow = (DiagonalResultRow) row;
            rowNumber = new SqlInt32(diagonalRow.RowNumber);
            value = new SqlDouble(diagonalRow.Value);
        }
    
    };
    

    Y aquí un ejemplo de su uso:

    CREATE TABLE #Square(
    	C1 float,
    	C2 float,
    	C3 float,
    	C4 float,
    	C5 float
    )
    INSERT INTO #Square
    VALUES 
    (3.5,7.5,7.3,7.1,3.8),
    (8.4,17.1,16.5,15.5,9.4),
    (4.5,8.7,8.0,7.9,3.9), 
    (4.7,10.2,10.1,10.1,5.2),
    (4.4,8.7,8.7,8.3,3.9) 
    
    SELECT * FROM dbo.GetDiagonals('SELECT * FROM #Square')
    
    DROP TABLE #Square

    Lo que produce el siguiente resultado:

    RowNumber	Value
    1			3,5
    2			15,9
    3			28,9
    4			37
    5			41,9


    Sunday, April 21, 2013 9:15 AM
  • Hola.

    ¿En qué punto te encuentras?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    Thursday, May 02, 2013 7:51 PM
    Moderator