none
C0NSULTA GROUP BY RRS feed

  • Pregunta

  • Buenas tardes.

    No sé si es posible, me temo que no. Quisiera que los acumulados que los saca en una columna se pudiesen insertar en una columna de la tabla de una base de datos SQL.

    La consulta es la siguiente:

    SELECT VENCIMIENTO,e_su_N,
    SUM(IMPORTE) AS IMPORTES
    FROM BGESTION.dbo.FACTURAS_RECIBIDAS GROUP BY VENCIMIENTO,e_su_N
    ORDER BY VENCIMIENTO,e_su_N

    O sea que los totales de "IMPORTES" los pudiese llevar a un campo de la tabla "TOTALACUMULADO".

    Gracias y saludos.


    miércoles, 23 de noviembre de 2016 17:53

Respuestas

  • Ángelroso,

    No tengo la estructura de tus tablas ni datos de prueba, por tanto te recomiendo que hagas las comprobaciones necesarias con datos de prueba para validar la propuesta:

    WITH T AS
    (
        SELECT    
    	   VENCIMIENTO,
    	   e_su_N,
    	   SUM(IMPORTE) AS IMPORTE
        FROM 
    	   BGESTION.dbo.FACTURAS_RECIBIDAS 
        GROUP BY 
    	   VENCIMIENTO,
    	   e_su_N
    )
    FilasActualizar AS
    (
        SELECT 
    	   t1.IMPORTE,	   
    	   fr.TOTAL_ACUMULADO,
    	   ROW_NUMBER() OVER(PARTITION BY fr.e_su_N, fr.VENCIMIENTO ORDER BY fr.VENCIMIENTO) r
        FROM 
    	   BGESTION.dbo.FACTURAS_RECIBIDAS fr
    	   INNER JOIN T t1 ON (fr.e_su_N = t1.e_su_N)
    		  AND (fr.VENCIMIENTO = t1.VENCIMIENTO)
    )
    UPDATE  FilasActualizar
    SET
        TOTAL_ACUMULADO = IMPORTE
    WHERE (r = 1);


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 23 de noviembre de 2016 20:41
  • Ángelroso,

    Lo siento, olvide una coma:

    ),
    FilasActualizar AS
    (


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Ángelroso jueves, 24 de noviembre de 2016 19:18
    jueves, 24 de noviembre de 2016 18:59

Todas las respuestas

  • Ángelroso,

    Claro que es posible, pero ¿requieres insertar o actualizar?.

    1. Si fuese insertar, ¿qué otras columnas tiene la tabla [TOTALACUMULADO]?
    2. Si fuese actualizar, ¿cuáles son las columnas en común entre ambas tablas para realizar el "match"?

    Si fuese una inserción y tomando el caso que la tabla destino tiene las columnas 'FechaVencimiento', 'NroFactura' e 'Importe', entonces sería de la siguiente manera:

    INSERT INTO dbo.TOTALACUMULADO (FechaVencimiento, NroFactura, Importe)
    SELECT    
        VENCIMIENTO,
        e_su_N,
        SUM(IMPORTE) AS IMPORTES 
    FROM 
        BGESTION.dbo.FACTURAS_RECIBIDAS 
    GROUP BY 
        VENCIMIENTO,
        e_su_N
    ORDER BY 
        VENCIMIENTO,
        e_su_N;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 23 de noviembre de 2016 18:03
  • Hola Williams:

    Es que no son dos tablas es una con los campos VENCIMIENTO, e_su_N,TOTAL,TOTAL_ACUMULADO.

    Tiene más campos pero no vienen al caso.

    Sería una actualización de la misma tabla.

    Muchas gracias por tu interés.

    Saludos.

    miércoles, 23 de noviembre de 2016 18:24
  • Ángelroso,

    De acuerdo, ¿pero cuales son las columnas para hacer match? ¿basta las columnas 'e_su_N' y 'VENCIMIENTO'?

    WITH T AS
    (
        SELECT    
    	   VENCIMIENTO,
    	   e_su_N,
    	   SUM(IMPORTE) AS IMPORTE
        FROM 
    	   BGESTION.dbo.FACTURAS_RECIBIDAS 
        GROUP BY 
    	   VENCIMIENTO,
    	   e_su_N
    )
    UPDATE fr
    SET
        fr.TOTAL_ACUMULADO = t1.IMPORTE
    FROM
        BGESTION.dbo.FACTURAS_RECIBIDAS fr
        INNER JOIN T t1 ON (fr.e_su_N = t1.e_su_N)
    	   AND (fr.VENCIMIENTO = t1.VENCIMIENTO);
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 23 de noviembre de 2016 18:31
  • Muchas gracias Williams.

    Voy a ver si me funciona, la idea ya la he captado.

    Saludos.

    miércoles, 23 de noviembre de 2016 18:46
  • Hola, Williams:

    Funciona perfectamente, lo que pasa es que pone el acumulado en todos los registros. ¿Sería posible que lo pusiese solo en uno de cada uno de ellos? O sea si hay 4 agrupados que lo pusiese en uno de ellos, más o menos como lo hace el GROUP BY.

    miércoles, 23 de noviembre de 2016 19:58
  • Ángelroso,

    No tengo la estructura de tus tablas ni datos de prueba, por tanto te recomiendo que hagas las comprobaciones necesarias con datos de prueba para validar la propuesta:

    WITH T AS
    (
        SELECT    
    	   VENCIMIENTO,
    	   e_su_N,
    	   SUM(IMPORTE) AS IMPORTE
        FROM 
    	   BGESTION.dbo.FACTURAS_RECIBIDAS 
        GROUP BY 
    	   VENCIMIENTO,
    	   e_su_N
    )
    FilasActualizar AS
    (
        SELECT 
    	   t1.IMPORTE,	   
    	   fr.TOTAL_ACUMULADO,
    	   ROW_NUMBER() OVER(PARTITION BY fr.e_su_N, fr.VENCIMIENTO ORDER BY fr.VENCIMIENTO) r
        FROM 
    	   BGESTION.dbo.FACTURAS_RECIBIDAS fr
    	   INNER JOIN T t1 ON (fr.e_su_N = t1.e_su_N)
    		  AND (fr.VENCIMIENTO = t1.VENCIMIENTO)
    )
    UPDATE  FilasActualizar
    SET
        TOTAL_ACUMULADO = IMPORTE
    WHERE (r = 1);


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 23 de noviembre de 2016 20:41
  • Hola, Williams:

    Estoy ejecutando el código que me pasaste y me da el error siguiente:

    ERROR 102

    System.Data.SqlClient.SqlExcepcion(0x80131904);Sintaxis incorrecta cerca de 'FilasActualizar'.

    El código que ejecuto es el siguiente:

    Imports System.Data
    Imports System.Data.SqlClient
    
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim vCommand As SqlCommand
            Dim vAdapter As SqlDataAdapter
            Dim vBuilder As SqlCommandBuilder
            Dim vDs As DataSet
            Dim vTable As DataTable
            Try
                Using cnn As New SqlConnection(AccesoBd.CadenaConexion)
                    Dim vcommandt As String = "WITH T AS
    (
        SELECT    
    	   VENCIMIENTO,
    	   e_su_N,
    	   SUM(IMPORTE) AS IMPORTE
        FROM 
    	   BGESTION.dbo.FACTURAS_RECIBIDAS 
        GROUP BY 
    	   VENCIMIENTO,
    	   e_su_N
    )
    FilasActualizar AS
    (
        SELECT 
    	   t1.IMPORTE,	   
    	   fr.TOTAL_ACUMULADO,
    	   ROW_NUMBER() OVER(PARTITION BY fr.e_su_N, fr.VENCIMIENTO ORDER BY fr.VENCIMIENTO) r
        FROM 
    	   BGESTION.dbo.FACTURAS_RECIBIDAS fr
    	   INNER JOIN T t1 ON (fr.e_su_N = t1.e_su_N)
    		  AND (fr.VENCIMIENTO = t1.VENCIMIENTO)
    )
    UPDATE  FilasActualizar
    SET
        TOTAL_ACUMULADO = IMPORTE
    WHERE (r = 1)"
    
    
                    cnn.Open()
                    vCommand = New SqlCommand(vcommandt, cnn)
                    vCommand.CommandType = CommandType.Text
                    vAdapter = New SqlDataAdapter(vCommand)
                    vBuilder = New SqlCommandBuilder(vAdapter)
                    vDs = New DataSet()
                    vAdapter.Fill(vDs, "FACTURASR")
                    vTable = vDs.Tables("FACTURASR")
                    cnn.Open()
                    DataGridView1.DataSource = vTable
                    DataGridView1.Columns("VENCIMIENTO").Width = 100
                    DataGridView1.Columns("ACREEDOR").Width = 270
                    DataGridView1.Columns("CIF").Width = 80
                    DataGridView1.Columns("IMPORTE").Width = 80
                    DataGridView1.Columns("IMPORTE").DefaultCellStyle.Format = "N2"
                    DataGridView1.Columns("IMPORTE").DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight
                    DataGridView1.Columns("IMPORTE_ACUMULADO").Width = 160
                    DataGridView1.Columns("IMPORTE_ACUMULADO").DefaultCellStyle.Format = "N2"
                    DataGridView1.Columns("IMPORTE_ACUMULADO").DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight
                    DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
                End Using
    
            Catch expSQL As SqlException
                MsgBox(expSQL.ToString, MsgBoxStyle.OkOnly, "SQL Exception")
            End Try
    
    
        End Sub
    
    
    
    End Class

    Estoy dando vueltas al tema pero no doy con el error.

    Muchas gracias por las molestias.

    Saludos.

    jueves, 24 de noviembre de 2016 18:45
  • Ángelroso,

    Lo siento, olvide una coma:

    ),
    FilasActualizar AS
    (


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Ángelroso jueves, 24 de noviembre de 2016 19:18
    jueves, 24 de noviembre de 2016 18:59
  • Hola, Williams.

    Va perfecto.

    Voy a tratar de que me agrupe a su vez campos de texto. Ya te comentaré.

    Muchas gracias y saludos.

    jueves, 24 de noviembre de 2016 19:18
  • Hola, Williams:

    Tal y como comenté, intento agrupar un campo de texto ya que lei por internet que se podía convirtiendolo en cadenas de longitud limitada, pero no lo consigo. No sé si será posible.

    Paso el código que es el que me pusiste y he añadido lo de los campos de texto, pero no me da mas que errores por lo que estoy dudando si será posible.

    WITH T AS
    (SELECT VENCIMIENTO, e_su_N,
       SUM(IMPORTE) AS IMPORTE,
       substring(FACTURA_NUM_EMISION,1,10) AS CONCEPTO_PAGO1
       FROM BGESTION.dbo.FACTURAS_RECIBIDAS 
       GROUP BY VENCIMIENTO, e_su_N, CONCEPTO_PAGO),
    FilasActualizar AS (SELECT t1.IMPORTE, fr.IMPORTE_ACUMULADO,
        t1.CONCEPTO_PAGO1, fr.CONCEPTO_PAGO,
       ROW_NUMBER() OVER(PARTITION BY fr.e_su_N, fr.VENCIMIENTO ORDER BY fr.VENCIMIENTO) r
       FROM BGESTION.dbo.FACTURAS_RECIBIDAS fr
    	    INNER JOIN T t1 ON (fr.e_su_N = t1.e_su_N)
    		AND (fr.VENCIMIENTO = t1.VENCIMIENTO))
    UPDATE FilasActualizar
    SET
        IMPORTE_ACUMULADO = IMPORTE
        CONCEPTO_PAGO = CONCEPTO_PAGO1
    WHERE (r = 1)

    Gracias y saludos.

    viernes, 25 de noviembre de 2016 21:24