none
consulta sql en 3 tablas RRS feed

  • Pregunta

  • estimados necesito ayuda para esta consulta a 3 tablas le puedo hacer la consulta pero el lio es cuando quiero agregar una tabla mas pero esta tiene los datos de manera vertical y también quiero que estos datos se muestren horizontal hice las consultas por separado y me hago pelota cuando quiero unirlas, agradecería su colaboración al respecto.

    gracias de antemano adjunto las consultas 

    esta consulta muestra  los datos de vertical a horizontal

    sudlicemp sudlifech sudlitmov sudlifapl sudlitcon sudlicorr sudlidesc sudliimpt
    5213   112014 1 1 6 1 HABER GANADO 1977.8
    5213   112014 1 1 11 1 BONO DE ANTIGUEDAD 216
    5213   112014 1 1 6 2 HORAS EXTRAS 65.93
    5213   112014 1 1 6 3 HORAS RECARGO 158.22
    5213   112014 1 1 13 50 SALARIO DOMINICAL 395.56
    5213   112014 1 1 13 20 BONO ESPECIAL 101.93

    Select SudliCemp, SudliFech,
     (select sudliimpt from sudli as s2
       where s2.sudlicemp = s1.sudlicemp
         and s2.SudliFech = s1.SudliFech
         and s2.sudlidesc = "HABER GANADO"),
     (select sudliimpt from sudli as s3
       where s3.sudlicemp = s1.sudlicemp
         and s3.SudliFech = s1.SudliFech
         and s3.sudlidesc = "BONO DE ANTIGUEDAD"), 
    (select sudliimpt from sudli as s4
       where s4.sudlicemp = s1.sudlicemp
         and s4.SudliFech = s1.SudliFech
         and s4.sudlidesc = "HORAS EXTRAS"),
    (select sudliimpt from sudli as s5
       where s5.sudlicemp = s1.sudlicemp
         and s5.SudliFech = s1.SudliFech
         and s5.sudlidesc = "HORAS RECARGO"),
    (select sudliimpt from sudli as s6
       where s6.sudlicemp = s1.sudlicemp
         and s6.SudliFech = s1.SudliFech
         and s6.sudlidesc = "SALARIO DOMINICAL"),
    (select sudliimpt from sudli as s7
       where s7.sudlicemp = s1.sudlicemp
         and s7.SudliFech = s1.SudliFech
         and s7.sudlidesc = "BONO ESPECIAL"))
      From sudli as s1

    la otra consulta de las otras 2 tablas es :

    SELECT suliqcemp, suinefing, suliqfech, 
           suliqanti, suliquneg, suliqccos, 
           suliqcarg, suliqsuel, 
           suliqhext, suliqhrec, suliqtgan, 
           suinestat, suinetemp
    FROM suliq, suine
    WHERE suliq.suliqcemp=suine.suinecemp

    espero que me haya podido explicado al respecto.

    gracias

     

    Degauss

    lunes, 11 de mayo de 2015 16:01

Respuestas

  • Hola:

    Creo que ya te habían comentado por ahí que usando la función PIVOT se resolvía, te doy la respuesta:

    DECLARE @tabA table ( 
    	sudlicemp INT , 
    	sudlifech INT, 
    	sudlitmov INT, 
    	sudlidfapl INT, 
    	sudlitcon INT, 
    	sudlitcorr INT, 
    	sudliddesc VARCHAR(30), 
    	sudlimpt DECIMAL(10,2) )
    DECLARE @tabB table ( 
    	suliqcemp INT , 
    	suliqfech INT , 
    	suliqanti VARCHAR(10), 
    	suliqsuel INT , 
    	suliqhext DECIMAL(10,2), 
    	suliqhrec DECIMAL(10,2), 
    	suliqtgan DECIMAL(10,2) )
    DECLARE @tabC table ( 
    	suinecemp INT , 
    	suinefing DATE, 
    	suineuneg INT, 
    	suineccos INT, 
    	suineccar INT )
    
    INSERT INTO @tabA
    VALUES( 5213, 112014, 1,1,6,1, 'HABER GANADO' , 1997.8 )
    ,( 5213, 112014, 1,1,11,1, 'BONO DE ANTIGUEDAD' , 216)
    
    INSERT INTO @tabB
    VALUES ( 5213, 122014, '0304', 1977.8, 16, 86, 3076.33 )
    
    INSERT INTO @tabC
    VALUES( 5213, '2010-09-01' , 5, 61 , 921 )
    
    SELECT 
    c.suinecemp, c.suinefing, c.suineuneg, c.suineccar, c.suineccar
    , b.suliqhrec, b.suliqfech
    , pt.[HABER GANADO], pt.[BONO DE ANTIGUEDAD]
    , b.suliqsuel , b.suliqtgan
    FROM ( SELECT sudlicemp , sudlimpt, sudliddesc FROM @tabA ) a
    PIVOT (
    SUM( a.sudlimpt ) FOR a.sudliddesc IN ([HABER GANADO] , [BONO DE ANTIGUEDAD])
    ) AS pt
    INNER JOIN @tabB b ON pt.sudlicemp = b.suliqcemp
    INNER JOIN @tabC c ON pt.sudlicemp = c.suinecemp
    

    SALUDOS!

    SERGIO SANCHEZ ARIAS
    facebook twitter blogger google

    • Marcado como respuesta PrcF miércoles, 13 de mayo de 2015 14:44
    martes, 12 de mayo de 2015 21:58

Todas las respuestas

  • Que tal amigo , puedes usar por pivot

    declare @t table( id int, nombre varchar(50), qty int )
    
    insert into @t 
    select 65538,'FWD',	1
    union select 65539, 'Cetes',8
    union select 65540, 'Cetes', 14
    union select 65541,'FWD',	12
    union select 65556, 'Cetes',35
    union select 65628,'FWD',321
    union select 66884,'Cetes',	11
    
    --select * from @t 
    
    select * from @t 
    PIVOT( SUM( qty ) FOR nombre IN ( [FWD],[Cetes] ) ) pt

    OBS: Favor vota si te es útil la información.
    Saludos
    Bader Molinas - Paraguay
    https://deveintel.wordpress.com/

    lunes, 11 de mayo de 2015 18:32
  • Gracias Bader por responder pero me complique mas lo que quiero es unir esas dos consultas en una sola toda vez que por separado me funcionan pero mi problema es y me complico el hacer que tome los datos de las 3 tablas.

    gracias,

     

    Degauss

    lunes, 11 de mayo de 2015 19:38
  • me podrias pasar el script  de tus 3 tablas para podes realizar la consulta..

    OBS: Favor vota si te es útil la información.
    Saludos
    Bader Molinas - Paraguay
    https://deveintel.wordpress.com/

    lunes, 11 de mayo de 2015 20:46
  • estimado Bader el campo común entre las 3 tablas es sudlicemp, suliqcemp, suinecemp que es el codigo de usuario de la tabla sudli esta la estructura y las otras dos tablas son esos los campos que necesito la cual me muestra correctamente el lio es que si lo ves en la tabla sudli los datos estan verticales y estos mismos quiero que salga de manera horizontal pero juntos con los de las tablas suine y suliq.

    Degauss

    martes, 12 de mayo de 2015 12:08
  • Hola PrcF

    Para poder ofrecerte una respuesta concreta, regálanos los scripts de creación de tablas y los datos en forma de sentencias INSERTs, para que podamos reproducir tu escenario. Ojalá puedas proporcionarnos al menos los SELECTs de cada una de tus tablas así como el resultado que esperas obtener.

    SALUDOS!


    SERGIO SANCHEZ ARIAS
    facebook twitter blogger google

    martes, 12 de mayo de 2015 15:04
  • Es muy complicado reproducir el problema si no  nos pasas el scripts de tus tablas..

    OBS: Favor vota si te es útil la información.
    Saludos
    Bader Molinas - Paraguay
    https://deveintel.wordpress.com/

    martes, 12 de mayo de 2015 15:43
  • les adjunto esta imagen de las tres tabla y sus campos y mas abajo esta como tendrian que salir los datos la fila mas larga.

    gracias de antemano lo que me esta costando es juntar suine y suliq con sudli 


    Degauss

    martes, 12 de mayo de 2015 21:29
  • Favor si podrias crear las tablas e insertar los datos.  De tal modo realizamos la query que necesitas

    Ejemplo:

    declare @Tabla table(id int,nombre varchar(50))
    insert into @Tabla
            ( id, nombre )
    values  ( 1, -- id - int
              'Carlos'  -- nombre - varchar(50)
              )
              select * from @Tabla as t


    OBS: Favor vota si te es útil la información.
    Saludos
    Bader Molinas - Paraguay
    https://deveintel.wordpress.com/


    martes, 12 de mayo de 2015 21:52
  • Hola:

    Creo que ya te habían comentado por ahí que usando la función PIVOT se resolvía, te doy la respuesta:

    DECLARE @tabA table ( 
    	sudlicemp INT , 
    	sudlifech INT, 
    	sudlitmov INT, 
    	sudlidfapl INT, 
    	sudlitcon INT, 
    	sudlitcorr INT, 
    	sudliddesc VARCHAR(30), 
    	sudlimpt DECIMAL(10,2) )
    DECLARE @tabB table ( 
    	suliqcemp INT , 
    	suliqfech INT , 
    	suliqanti VARCHAR(10), 
    	suliqsuel INT , 
    	suliqhext DECIMAL(10,2), 
    	suliqhrec DECIMAL(10,2), 
    	suliqtgan DECIMAL(10,2) )
    DECLARE @tabC table ( 
    	suinecemp INT , 
    	suinefing DATE, 
    	suineuneg INT, 
    	suineccos INT, 
    	suineccar INT )
    
    INSERT INTO @tabA
    VALUES( 5213, 112014, 1,1,6,1, 'HABER GANADO' , 1997.8 )
    ,( 5213, 112014, 1,1,11,1, 'BONO DE ANTIGUEDAD' , 216)
    
    INSERT INTO @tabB
    VALUES ( 5213, 122014, '0304', 1977.8, 16, 86, 3076.33 )
    
    INSERT INTO @tabC
    VALUES( 5213, '2010-09-01' , 5, 61 , 921 )
    
    SELECT 
    c.suinecemp, c.suinefing, c.suineuneg, c.suineccar, c.suineccar
    , b.suliqhrec, b.suliqfech
    , pt.[HABER GANADO], pt.[BONO DE ANTIGUEDAD]
    , b.suliqsuel , b.suliqtgan
    FROM ( SELECT sudlicemp , sudlimpt, sudliddesc FROM @tabA ) a
    PIVOT (
    SUM( a.sudlimpt ) FOR a.sudliddesc IN ([HABER GANADO] , [BONO DE ANTIGUEDAD])
    ) AS pt
    INNER JOIN @tabB b ON pt.sudlicemp = b.suliqcemp
    INNER JOIN @tabC c ON pt.sudlicemp = c.suinecemp
    

    SALUDOS!

    SERGIO SANCHEZ ARIAS
    facebook twitter blogger google

    • Marcado como respuesta PrcF miércoles, 13 de mayo de 2015 14:44
    martes, 12 de mayo de 2015 21:58
  • Gracias, amigo Sergio pude completar mi consulta, es como siempre digo las cosas ya están inventadas lo único es adecuarlas a lo que uno quiere y lo tuyo me quedo excelente muchas gracias.

    Degauss

    miércoles, 13 de mayo de 2015 14:44