none
SUMAR TABLAS RRS feed

  • Pregunta

  • Buenos dias al foro:

    tengo la sgte consulta; tengo tres tablas cunado hago la union no me da lo real, el erros me da por que por ejemplo:

    si tengo solo 10 registros en la tabla pago1 y 100 registros en pago2,me multiplica los registros.lo que quiero logras es algo como lo q muetro en la imagen


    lutermick

    jueves, 19 de julio de 2012 16:05

Respuestas

  • Trata esto:

    select pagos.codigo, tablaA.nombre, pagos.tipopago, sum(pagos.monto), pagos.mes, pagos.ano
    
    from
    
    (
    
    select codigo, tipopago, monto, mes, ano from pago1
    
    union all
    
    select codigo, tipopago, monto, mes, ano from pago2
    
    ) pagos left join tablaA on pagos.codigo=tablaA.codigo
    
    group by pagos.codigo, tablaA.nombre, pagos.tipopago, pagos.mes, pagos.ano

    Saludos,

    Monica


    This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" and "Vote as Helpful" on posts that help you. This can be beneficial to other community members reading the thread.

    • Propuesto como respuesta HunchbackMVP jueves, 19 de julio de 2012 17:16
    • Marcado como respuesta Eder Costa lunes, 23 de julio de 2012 17:19
    jueves, 19 de julio de 2012 16:14
  • Necesitas usar la tabla completa o puedes usar un grupo de registros cada vez? Supongo que si tienes 5 millones de registros, los que tu aplicacion necesita mostrar son una parte solamente, como por ejemplo registros de un cierto rango de tiempo. Si esto es cierto, seria mas efectivo que filtres los registros que no necesitas de la tabla.

    Por ejemplo, si fueras a usar solo los registros de un cierto año podrias usar un parametro (@ano)  que el usuario asigna desde la aplicacion, y tu query seria algo asi:

    select pagos.codigo, tablaA.nombre, pagos.tipopago, sum(pagos.monto), pagos.mes, pagos.ano
    
    from
    
    (
    
    select codigo, tipopago, monto, mes, ano from pago1 where ano = @ano
    
    union all
    
    select codigo, tipopago, monto, mes, ano from pago2 where ano = @ano
    
    ) pagos left join tablaA on pagos.codigo=tablaA.codigo
    
    group by pagos.codigo, tablaA.nombre, pagos.tipopago, pagos.mes, pagos.ano

    En este caso, si tienes los indices necesarios ya no estas recorriendo las tablas completamente y el proceso seria mas eficiente.

    Saludos,

    Monica


    This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" and "Vote as Helpful" on posts that help you. This can be beneficial to other community members reading the thread.

    • Marcado como respuesta Eder Costa lunes, 23 de julio de 2012 17:19
    jueves, 19 de julio de 2012 17:21
  • Un poco dificil de dar alguna sugerencia sin ver el esquema de las tablas, incluyendo indices y restricciones, asi como el plan de ejecucion.

    Una cosa que puedes probar es hacer la agregacion primero y luego la union.

    select 
    	pagos.codigo, tablaA.nombre, pagos.tipopago, pagos.monto, pagos.mes, pagos.ano
    from
    	(
    	select codigo, tipopago, mes, ano, SUM(sum_monto) AS monto
    	FROM
    		(  
    		select codigo, tipopago, mes, ano, SUM(monto) AS sum_monto from pago1 GROUP BY codigo, tipopago, mes, ano
    		union all
    		select codigo, tipopago, mes, ano, SUM(monto) AS sum_monto from pago2 GROUP BY codigo, tipopago, mes, ano
    		) AS U
    	GROUP BY codigo, tipopago, mes, ano
    	) AS pagos 
    	left join 
    	tablaA 
    	on pagos.codigo=tablaA.codigo;


    AMB

    Some guidelines for posting questions...

    • Marcado como respuesta Eder Costa lunes, 23 de julio de 2012 17:19
    jueves, 19 de julio de 2012 17:23

Todas las respuestas

  • Trata esto:

    select pagos.codigo, tablaA.nombre, pagos.tipopago, sum(pagos.monto), pagos.mes, pagos.ano
    
    from
    
    (
    
    select codigo, tipopago, monto, mes, ano from pago1
    
    union all
    
    select codigo, tipopago, monto, mes, ano from pago2
    
    ) pagos left join tablaA on pagos.codigo=tablaA.codigo
    
    group by pagos.codigo, tablaA.nombre, pagos.tipopago, pagos.mes, pagos.ano

    Saludos,

    Monica


    This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" and "Vote as Helpful" on posts that help you. This can be beneficial to other community members reading the thread.

    • Propuesto como respuesta HunchbackMVP jueves, 19 de julio de 2012 17:16
    • Marcado como respuesta Eder Costa lunes, 23 de julio de 2012 17:19
    jueves, 19 de julio de 2012 16:14
  • Gracias Monica, me ayudo mucho, muy buena las subconsulta... una pregunta mira mi tabla pagos2 tiene 4857123 casi 5 millones de de registros y bueno cuando corro la consulta demora un po co 50 sgundos, y bueno quiero hacer una aplicacion de los diferentes reportes q saque de esta consulta y hay alguna manera de hacer q corra mas rapido lo digo porq no quiero tener problemas cuando los usuarios usen la aplicacion.

    cuando esta cargado en memoria ya corre normal.....

    Gracias


    lutermick

    jueves, 19 de julio de 2012 17:04
  • Necesitas usar la tabla completa o puedes usar un grupo de registros cada vez? Supongo que si tienes 5 millones de registros, los que tu aplicacion necesita mostrar son una parte solamente, como por ejemplo registros de un cierto rango de tiempo. Si esto es cierto, seria mas efectivo que filtres los registros que no necesitas de la tabla.

    Por ejemplo, si fueras a usar solo los registros de un cierto año podrias usar un parametro (@ano)  que el usuario asigna desde la aplicacion, y tu query seria algo asi:

    select pagos.codigo, tablaA.nombre, pagos.tipopago, sum(pagos.monto), pagos.mes, pagos.ano
    
    from
    
    (
    
    select codigo, tipopago, monto, mes, ano from pago1 where ano = @ano
    
    union all
    
    select codigo, tipopago, monto, mes, ano from pago2 where ano = @ano
    
    ) pagos left join tablaA on pagos.codigo=tablaA.codigo
    
    group by pagos.codigo, tablaA.nombre, pagos.tipopago, pagos.mes, pagos.ano

    En este caso, si tienes los indices necesarios ya no estas recorriendo las tablas completamente y el proceso seria mas eficiente.

    Saludos,

    Monica


    This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" and "Vote as Helpful" on posts that help you. This can be beneficial to other community members reading the thread.

    • Marcado como respuesta Eder Costa lunes, 23 de julio de 2012 17:19
    jueves, 19 de julio de 2012 17:21
  • Un poco dificil de dar alguna sugerencia sin ver el esquema de las tablas, incluyendo indices y restricciones, asi como el plan de ejecucion.

    Una cosa que puedes probar es hacer la agregacion primero y luego la union.

    select 
    	pagos.codigo, tablaA.nombre, pagos.tipopago, pagos.monto, pagos.mes, pagos.ano
    from
    	(
    	select codigo, tipopago, mes, ano, SUM(sum_monto) AS monto
    	FROM
    		(  
    		select codigo, tipopago, mes, ano, SUM(monto) AS sum_monto from pago1 GROUP BY codigo, tipopago, mes, ano
    		union all
    		select codigo, tipopago, mes, ano, SUM(monto) AS sum_monto from pago2 GROUP BY codigo, tipopago, mes, ano
    		) AS U
    	GROUP BY codigo, tipopago, mes, ano
    	) AS pagos 
    	left join 
    	tablaA 
    	on pagos.codigo=tablaA.codigo;


    AMB

    Some guidelines for posting questions...

    • Marcado como respuesta Eder Costa lunes, 23 de julio de 2012 17:19
    jueves, 19 de julio de 2012 17:23