none
¿Como agrupo datos en sql server 2014? RRS feed

  • Pregunta

  • Saludos, me encuentro haciendo un proyecto de cuentas por cobrar, y estoy intentando que una vez tenga la factura inicial y a medida que se vayan generando pagos estos vayan mostrando en una expresion de mi vista sql el saldo actual, todo bien siempre y cuando los pagos sean del mismo monto, se me suman y agrupan como es el caso de la fila marcada con el numero dos, pero, si a esa misma factura le agrego un pago diferente a los monto anteriores, esta me añade una nueva fila en vez de sumarla junto a las demas, les dejare el codigo de la consulta y espero que me puedan ayudar, gracias de ante mano.


    SELECT        TOP (100) PERCENT dbo.TB_FACTURA.ID_FACT AS Factura, dbo.TB_FACTURA.FECHA_FACTURA AS Emision, dbo.TB_FACTURA.FECHA_VENCE AS Vence, dbo.TB_FACTURA.CONCEPTO AS Concepto, 
                             dbo.TB_FACTURA.CUOTAS AS Cuotas, dbo.TB_FACTURA.VALOR AS [Total _Factura], SUM(dbo.TB_RECIBO.MONTO) AS Pagado, dbo.TB_FACTURA.VALOR - SUM(dbo.TB_RECIBO.MONTO) AS Saldo, 
                             dbo.TB_FACTURA.ID_STUDENT
    FROM            dbo.TB_FACTURA INNER JOIN
                             dbo.TB_RECIBO ON dbo.TB_FACTURA.ID_FACT = dbo.TB_RECIBO.ID_FACT
    GROUP BY dbo.TB_FACTURA.FECHA_FACTURA, dbo.TB_FACTURA.FECHA_VENCE, dbo.TB_FACTURA.CONCEPTO, dbo.TB_FACTURA.CUOTAS, dbo.TB_FACTURA.VALOR, dbo.TB_FACTURA.VALOR - dbo.TB_RECIBO.MONTO, 
                             dbo.TB_FACTURA.ID_STUDENT, dbo.TB_FACTURA.ID_FACT
    ORDER BY dbo.TB_FACTURA.ID_FACT, SUM(dbo.TB_RECIBO.MONTO) 

    hola!

    jueves, 26 de abril de 2018 18:17

Respuestas

  • Hola Adam F. Olivo Eusebio:

    En principio tienes que eliminar de la agrupación esta fila.

    SELECT TOP (100) PERCENT dbo.TB_FACTURA.ID_FACT AS Factura,
                             dbo.TB_FACTURA.FECHA_FACTURA AS Emision,
                             dbo.TB_FACTURA.FECHA_VENCE AS Vence,
                             dbo.TB_FACTURA.CONCEPTO AS Concepto,
                             dbo.TB_FACTURA.CUOTAS AS Cuotas,
                             dbo.TB_FACTURA.VALOR AS [Total _Factura],
                             SUM(dbo.TB_RECIBO.MONTO) AS Pagado,
                             dbo.TB_FACTURA.VALOR - SUM(dbo.TB_RECIBO.MONTO) AS Saldo,
                             dbo.TB_FACTURA.ID_STUDENT
    FROM dbo.TB_FACTURA
         INNER JOIN dbo.TB_RECIBO ON dbo.TB_FACTURA.ID_FACT = dbo.TB_RECIBO.ID_FACT
    GROUP BY dbo.TB_FACTURA.FECHA_FACTURA,
             dbo.TB_FACTURA.FECHA_VENCE,
             dbo.TB_FACTURA.CONCEPTO,
             dbo.TB_FACTURA.CUOTAS,
             dbo.TB_FACTURA.VALOR,
    /*         dbo.TB_FACTURA.VALOR - dbo.TB_RECIBO.MONTO,
    SI AGRUPAS POR ESTOS VALORES, Y VARÍAN, ENTONCES TIENE QUE REPETIR LA FILA
    */
             dbo.TB_FACTURA.ID_STUDENT,
             dbo.TB_FACTURA.ID_FACT
    ORDER BY dbo.TB_FACTURA.ID_FACT,
             pagado; /*ORDER BY YA CONOCE EL NOMBRE DE LAS COLUMNAS DE SELECT, POR TANTO NO LE HAGAS TRABAJAR CON UNA
    FUNCIÓN, PONLE EL ALIAS DE TU COLUMNA */ 

    Prueba con estas indicaciones. Seguro que te mejora un poquito.



    jueves, 26 de abril de 2018 20:49

Todas las respuestas

  • Hola Adam F. Olivo Eusebio:

    En principio tienes que eliminar de la agrupación esta fila.

    SELECT TOP (100) PERCENT dbo.TB_FACTURA.ID_FACT AS Factura,
                             dbo.TB_FACTURA.FECHA_FACTURA AS Emision,
                             dbo.TB_FACTURA.FECHA_VENCE AS Vence,
                             dbo.TB_FACTURA.CONCEPTO AS Concepto,
                             dbo.TB_FACTURA.CUOTAS AS Cuotas,
                             dbo.TB_FACTURA.VALOR AS [Total _Factura],
                             SUM(dbo.TB_RECIBO.MONTO) AS Pagado,
                             dbo.TB_FACTURA.VALOR - SUM(dbo.TB_RECIBO.MONTO) AS Saldo,
                             dbo.TB_FACTURA.ID_STUDENT
    FROM dbo.TB_FACTURA
         INNER JOIN dbo.TB_RECIBO ON dbo.TB_FACTURA.ID_FACT = dbo.TB_RECIBO.ID_FACT
    GROUP BY dbo.TB_FACTURA.FECHA_FACTURA,
             dbo.TB_FACTURA.FECHA_VENCE,
             dbo.TB_FACTURA.CONCEPTO,
             dbo.TB_FACTURA.CUOTAS,
             dbo.TB_FACTURA.VALOR,
    /*         dbo.TB_FACTURA.VALOR - dbo.TB_RECIBO.MONTO,
    SI AGRUPAS POR ESTOS VALORES, Y VARÍAN, ENTONCES TIENE QUE REPETIR LA FILA
    */
             dbo.TB_FACTURA.ID_STUDENT,
             dbo.TB_FACTURA.ID_FACT
    ORDER BY dbo.TB_FACTURA.ID_FACT,
             pagado; /*ORDER BY YA CONOCE EL NOMBRE DE LAS COLUMNAS DE SELECT, POR TANTO NO LE HAGAS TRABAJAR CON UNA
    FUNCIÓN, PONLE EL ALIAS DE TU COLUMNA */ 

    Prueba con estas indicaciones. Seguro que te mejora un poquito.



    jueves, 26 de abril de 2018 20:49
  • Hola de nuevo:

    Además, y creo que es un debate muy extendido, creo que debieras de tener en cuenta, el order by, o mejor dicho, sacarlo de la vista.

    https://social.msdn.microsoft.com/Forums/es-ES/16214902-9ec3-490b-9b1e-337de3c727f7/select-top100-percent-por-que?forum=sqlserveres

    https://stackoverflow.com/questions/1622878/why-use-select-top-100-percent?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

    y otro interesante.

    https://www.sqlshack.com/sql-server-top-clause-performance-problem-parallelism/

    Creo que en conclusión, es más fácil, hacer un

    select * from mivista order by loquequiero.

    Un saludo

    jueves, 26 de abril de 2018 21:03
  • Javi hermano, muchas gracias por tu ayuda, me funciono a la perfección, un abrazo bro. 

    Hola!.

    viernes, 27 de abril de 2018 13:58