none
Seleccionar columnas de distintas tablas RRS feed

  • Pregunta

  • Hola, quisiera que me ayudaran,

    Tengo tres tablas

    Tabla1 con campos numero1, proveedor, usuario, otra columna

    Tabla 2 con asocie_a_tabla1, numero2, descripcion, monto, saldo otras 2 columnas

    Tabla 3 con asocie_tabla2, numero3,monto, acumulado, otra columna

    Quisiera hacer un select de cada campo de todas las tablas, exceptuando a las otras columnas que no mencione,

    y que en el campo de tabla2 donde dice saldo, reste todos los registros en el campo de monto de la tabla3 donde tengan el mismo asocie con tabla2, menos el monto de tabla2 donde se realiza el asocie,

    No se si me explique bien pero esa es mi idea, espero puedan ayudarme, 

    Gracias

    viernes, 11 de noviembre de 2016 17:14

Respuestas

  • quizá sea esto lo que quieres hacer

    SELECT contrato.NUMERO_DE_CONTRATO,
            contrato.PROVEEDOR, 
            contrato.USUARIO_ADMINISTRADOR,
            orden.NUMERO_DE_CONTRATO,
            orden.NUMERO_DE_ORDEN,
            orden.MONEDA,
            orden.MONTO,
            (orden.MONTO-(select  Sum(MONTO_FACTURA) from facturas WHERE orden.NUMERO_DE_ORDEN=facturas.NUMERO_DE_ORDEN)) AS SALDO,
            facturas.NUMERO_DE_ORDEN,
            facturas.NUMERO_DE_FACTURA,
            facturas.MONTO_FACTURA,
            (select  Sum(MONTO_FACTURA) from facturas WHERE orden.NUMERO_DE_ORDEN=facturas.NUMERO_DE_ORDEN)as ACUMULADO
            FROM contrato INNER JOIN orden on 
            contrato.NUMERO_DE_CONTRATO=orden.NUMERO_DE_CONTRATO
            

    No te vale con un join, con un join por cada factura te aparecerán repetidos contratos y ordenes.

    Si entiendo lo que quieres hacer con esa suma es sacar el importe total de facturas relacionadas con esta orden. eso es una subconsulta.

    Se puede hacer de otras formas pero creo que esta te resultará, de momento, mas sencilla de probar y entender.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta Ziany lunes, 14 de noviembre de 2016 16:52
    sábado, 12 de noviembre de 2016 18:11
    Moderador

Todas las respuestas

  • No se si te explicaste bien, pero desde luego, yo no entiendo lo que quieres hacer. Lo he leído 3 veces. ¿puedes clarificarlo?

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    viernes, 11 de noviembre de 2016 17:42
    Moderador
  • Ok

    Digamos que tengo 3 tablas con 6 campos cada una

    cada una relacionada con foreign key

    quiero hacer un select de las tres tablas, pero solo de 3 campos en cada una.

    Y donde las tablas se relacionen se sumen todos los registros de un campo numerico donde tengan la misma foreign key en el campo ACUMULADO, y que en el campo Saldo, se resten el campo ACUMULADO Y otro de otra tabla.

    Espero entiendas y puedas ayudarme


    • Editado Ziany viernes, 11 de noviembre de 2016 17:49
    viernes, 11 de noviembre de 2016 17:48
  • Hola

    Eso lo puedes hacer con un inner join, haciendo la union por el campo en común entre las tres.

    https://technet.microsoft.com/en-us/library/ms190014(v=sql.105).aspx

    En el select tu puedes indicar que campos quieres de que tabla ya sea por el nombre.campo o alias.campo, a tu camo calculado lo puedes ingresar (campo1-campo3) as total.

    select
    t1.campo1,
    t2.campo1,
    t3.campo1,
    (t1.campo1-t3.campo1) as total
    from tabla1 t1 inner join tabla2 t2 on
    t1.llave=t2.llave
    innet join tabla3 t3 on
    t1.llave=t3.llave

    Saludos


    viernes, 11 de noviembre de 2016 18:23
  • Lo he hecho de esa manera, pero me ha salido un error de sintaxis:

    	SELECT contrato.NUMERO_DE_CONTRATO,
            contrato.PROVEEDOR, 
            contrato.USUARIO_ADMINISTRADOR,
            orden.NUMERO_DE_CONTRATO,
            orden.NUMERO_DE_ORDEN,
            orden.MONEDA,
            orden.MONTO,
            (orden.MONTO-facturas.ACUMULADO) AS SALDO,
            facturas.NUMERO_DE_ORDEN,
            facturas.NUMERO_DE_FACTURA,
            facturas.MONTO_FACTURA,
            (Sum(MONTO_FACTURA)WHERE orden.NUMERO_DE_ORDEN=facturas.NUMERO_DE_ORDEN)as ACUMULADO
            FROM contrato INNER JOIN orden on 
            contrato.NUMERO_DE_CONTRATO=orden.NUMERO_DE_CONTRATO
            inner join facturas on
            orden.NUMERO_DE_ORDEN=facturas.NUMERO_DE_ORDEN
    

    El error aparece el la linea:

    (Sum(MONTO_FACTURA)WHERE orden.NUMERO_DE_ORDEN=facturas.NUMERO_DE_ORDEN)as ACUMULADO

    En la palabra where.

    Podrias decirme como solucionarlo?

    Gracias!

    viernes, 11 de noviembre de 2016 20:31
  • Hola

    Ya no tienes que hacer el where en el sum, o para que pretender hacerlo?, la función suma es una función agrupadora.

    https://msdn.microsoft.com/en-us/library/ms187810.aspx

    Lo que hace esa función es sumar todas los registros de modo agrupado.

    https://msdn.microsoft.com/es-es/library/ms177673(v=sql.120).aspx

    Exactamente que calculo deseas hacer, lo que yo entendí es que deseas sumar un campo con otro, o lo que tu deseas es sacar la suma acumulada?

    Saludos

    viernes, 11 de noviembre de 2016 21:27
  • quizá sea esto lo que quieres hacer

    SELECT contrato.NUMERO_DE_CONTRATO,
            contrato.PROVEEDOR, 
            contrato.USUARIO_ADMINISTRADOR,
            orden.NUMERO_DE_CONTRATO,
            orden.NUMERO_DE_ORDEN,
            orden.MONEDA,
            orden.MONTO,
            (orden.MONTO-(select  Sum(MONTO_FACTURA) from facturas WHERE orden.NUMERO_DE_ORDEN=facturas.NUMERO_DE_ORDEN)) AS SALDO,
            facturas.NUMERO_DE_ORDEN,
            facturas.NUMERO_DE_FACTURA,
            facturas.MONTO_FACTURA,
            (select  Sum(MONTO_FACTURA) from facturas WHERE orden.NUMERO_DE_ORDEN=facturas.NUMERO_DE_ORDEN)as ACUMULADO
            FROM contrato INNER JOIN orden on 
            contrato.NUMERO_DE_CONTRATO=orden.NUMERO_DE_CONTRATO
            

    No te vale con un join, con un join por cada factura te aparecerán repetidos contratos y ordenes.

    Si entiendo lo que quieres hacer con esa suma es sacar el importe total de facturas relacionadas con esta orden. eso es una subconsulta.

    Se puede hacer de otras formas pero creo que esta te resultará, de momento, mas sencilla de probar y entender.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta Ziany lunes, 14 de noviembre de 2016 16:52
    sábado, 12 de noviembre de 2016 18:11
    Moderador
  • Hola Miguel,

    Eso es precisamente lo que quiero hacer y el código esta excelente, solo que me ha salido este error:

    "El identificador formado por varias partes "facturas.NUMERO_DE_ORDEN" no se pudo enlazar.
    Mens. 4104, Nivel 16, Estado 1, Línea 10
    El identificador formado por varias partes "facturas.NUMERO_DE_FACTURA" no se pudo enlazar.
    Mens. 4104, Nivel 16, Estado 1, Línea 11
    El identificador formado por varias partes "facturas.MONTO_FACTURA" no se pudo enlazar."

    Supongo que debería hacer un inner join con facturas, si no es así, te agradecería que me indicaras como solucionarlo.

    Saludos!

    lunes, 14 de noviembre de 2016 13:15
  • Pasanos la estructura de las tablas porque si no esto  es imposible.

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 14 de noviembre de 2016 15:56
    Moderador
  • De hecho ya he podido resolverlo solo que se me ha olvidado marcar como respuesta,

    SELECT contrato.NUMERO_DE_CONTRATO,
            contrato.PROVEEDOR, 
            contrato.USUARIO_ADMINISTRADOR,
            orden.NUMERO_DE_ORDEN,
            orden.MONEDA,
            orden.MONTO,
            (select  Sum(MONTO_FACTURA) from facturas WHERE orden.NUMERO_DE_ORDEN=facturas.NUMERO_DE_ORDEN)as ACUMULADO,
            (orden.MONTO-(select  Sum(MONTO_FACTURA) from facturas WHERE orden.NUMERO_DE_ORDEN=facturas.NUMERO_DE_ORDEN)) AS SALDO
            FROM contrato INNER JOIN orden on 
            contrato.NUMERO_DE_CONTRATO=orden.NUMERO_DE_CONTRATO order by NUMERO_DE_CONTRATO

    Tu código me fue de mucha ayuda, resolviste tres problemas que tenia de una vez; te lo agradezco mucho.

    Saludos!

    lunes, 14 de noviembre de 2016 16:52