locked
Union de Querys en SQL Server 2008 RRS feed

  • Pregunta

  • Buen dia mi problema es que no al unir mis querys si logro unirlos pero como obtengo totales, me da totales muy elevados creo que algo tiene que ver con el join, bueno estos son mis querys como yo creo que se deben unir:

    select  u.nombre_usuario
    ,  SUM(ISNULL(totalEscaneos,0) +
     ISNULl(totalEscaneosSalida,0) +
     ISNULl(totalEscaneosSinRegistro,0) +
     ISNULl(totalEscaneosSinRegistroSalidaRefri,0) +
     ISNULl(totalEscaneosSinRegistroFifo,0) +
     ISNULl(totalEscaneosSinReposo,0) +
     ISNULL(totalEscaneosEntradaFifo,0) +
     ISNULL(totalEscaneosSalidaFifo,0)) as Total
    , Convert(Char(10), fecha  , 101)  Fecha

    from tb_usuarios u
    left join (
     SELECT id_usuario ,  Convert(Char(10), tb_escaneos.fecha  , 101) as fecha, SUM( num_escaneos ) as totalEscaneos
     FROM tb_escaneos WHERE Convert(Char(10), tb_escaneos.fecha  , 101) between '01/01/2013' AND '06/14/2013' AND fifo is null
     GROUP BY id_usuario ,  Convert(Char(10), tb_escaneos.fecha  , 101)
    ) e on u.id_usuario = e.id_usuario
    left join (
     SELECT  id_usuario ,  Convert(Char(10), tb_escaneosSalida .fecha  , 101) as fechaSalida, SUM( num_escaneos ) as totalEscaneosSalida
     FROM tb_escaneosSalida WHERE Convert(Char(10), tb_escaneosSalida .fecha  , 101) between '01/01/2013' AND '06/14/2013' AND fifo is null
     GROUP BY id_usuario ,  Convert(Char(10), tb_escaneosSalida .fecha  , 101)
    ) es on u.id_usuario = es.id_usuario
    left join (
     SELECT  id_usuario ,  Convert(Char(10), tb_registros .fecha  , 101) as fechaSinRegistro, SUM( sin_registroTotal ) as totalEscaneosSinRegistro
     FROM tb_registros  WHERE Convert(Char(10), tb_registros  .fecha  , 101) between '01/01/2013' AND '06/14/2013'
     GROUP BY id_usuario ,  Convert(Char(10), tb_registros .fecha  , 101)
    ) et on u.id_usuario = et.id_usuario
    left join (
     SELECT  id_usuario , Convert(Char(10), tb_registros .fecha  , 101) as fechaSinRegistroSalidaRefri,  SUM( sin_registroSalidaRefri  ) as totalEscaneosSinRegistroSalidaRefri
     FROM tb_registros  WHERE Convert(Char(10), tb_registros  .fecha  , 101) between '01/01/2013' AND '06/14/2013'
     GROUP BY id_usuario , Convert(Char(10), tb_registros .fecha  , 101)
    ) ete on u.id_usuario = ete.id_usuario

    left join (
     SELECT  id_usuario , Convert(Char(10), tb_registros .fecha  , 101) as fechaSinRegistroFifo, SUM( sin_registroFifo  ) as totalEscaneosSinRegistroFifo
     FROM tb_registros  WHERE Convert(Char(10), tb_registros  .fecha  , 101) between '01/01/2013' AND '06/14/2013'
     GROUP BY id_usuario , Convert(Char(10), tb_registros .fecha  , 101)
    ) ele on u.id_usuario = ele.id_usuario

    left join (
     SELECT  id_usuario , Convert(Char(10), tb_registros .fecha  , 101) as fechaSinReposo, SUM( no_cumplioReposo   ) as totalEscaneosSinReposo
     FROM tb_registros  WHERE Convert(Char(10), tb_registros  .fecha  , 101) between '01/01/2013' AND '06/14/2013'
     GROUP BY id_usuario, Convert(Char(10), tb_registros .fecha  , 101)
    ) el on u.id_usuario = el.id_usuario
    left join (
     SELECT id_usuario , Convert(Char(10), tb_escaneos .fecha  , 101) as fechaEntradaFifo,  SUM( num_escaneos ) as totalEscaneosEntradaFifo
     FROM tb_escaneos WHERE Convert(Char(10), tb_escaneos.fecha  , 101) between '01/01/2013' AND '06/14/2013' AND fifo = 1
     GROUP BY id_usuario , Convert(Char(10), tb_escaneos .fecha  , 101)
    ) epe on u.id_usuario = epe.id_usuario
    left join (
     SELECT id_usuario , Convert(Char(10), tb_escaneosSalida  .fecha  , 101) as fechaSalidaFifo,  SUM( num_escaneos ) as totalEscaneosSalidaFifo
     FROM tb_escaneosSalida  WHERE Convert(Char(10), tb_escaneosSalida .fecha  , 101) between '01/01/2013' AND '06/14/2013' AND fifo = 1
     GROUP BY id_usuario , Convert(Char(10), tb_escaneosSalida  .fecha  , 101)
    ) eper on u.id_usuario = eper.id_usuario
    group by
    u.nombre_usuario
    ,Convert(Char(10), fecha  , 101)
    order by
    u.nombre_usuario
    ,Convert(Char(10), fecha  , 101)

    Y me da este resultado:

    que si pueden observar tiene el usuario Irinero Torres tiene un total de 432 cuando en realidad no tiene mas de 10, cuando ejecuto los querys por separado si me dan los resultados exactos pero al unirlos o juntarlos es cuando pasa esto les agradeceria que me ayudaran, Saludos!!



    miércoles, 19 de junio de 2013 13:29

Respuestas

Todas las respuestas

  • Y no deberias usar solo INNER JOIN en vez de LEFT JOIN? tambien tienes muchas fechas nulas, quiza necesites validar solos las fachas con IS NOT NULL.. por ahi debe pasar el problema..
    miércoles, 19 de junio de 2013 13:40
  • Creo que tienes varias tablas repetidas, podrias verificar tu query por partes es decir ejecutar cada parte por separado y ver en donde te esta "duplicando" los resultados

    And asked him what is your name and adswered saying my name is legion for we are many mark 5:9

    miércoles, 19 de junio de 2013 14:17
  • tu problema son las fechas nulas estas poniendo clausulas en el where con valores nulos por tanto no los toma, prueba ha contar resgistros en vez de sumar columnas.
    • Propuesto como respuesta Atir58 miércoles, 26 de junio de 2013 19:59
    miércoles, 19 de junio de 2013 14:44
  • Creo que siempre te va a dar distinto si lo sacas separado a si lo sacas individual.

    Es decir si un usuario tiene 10 escaneos y 10 registros son 20 registros si? Pero si haces union entre esas dos consultas no te dará 20 te dará 100. 10 a la 10... No lo detallé mucho, pero creo allí está el error.

    Prueba con subconsultas en vez de uniones.

    Es decir

    select  u.nombre_usuario, (SELECT SUM( num_escaneos ) as totalEscaneos
    FROM tb_escaneos WHERE Convert(Char(10), tb_escaneos.fecha  , 101) between '01/01/2013' AND '06/14/2013' AND fifo is null
    AND u.id_usuario = id_usuario)..... Algo así...

    Saludos cordiales,

     

    miércoles, 19 de junio de 2013 15:09
  • Algo así te digo:

    DECLARE @usuario AS TABLE
    (Usuario VARCHAR(10))

    DECLARE @Escaneos AS TABLE
    (Usuario VARCHAR(10), Accion INT)

    DECLARE @Impresiones AS TABLE
    (Usuario VARCHAR(10), Accion INT)

    INSERT INTO @usuario (Usuario) VALUES  ('YO')

    INSERT INTO @Escaneos (Usuario, Accion) VALUES  ('YO', 1)
    INSERT INTO @Escaneos (Usuario, Accion) VALUES  ('YO', 2)
    INSERT INTO @Impresiones (Usuario, Accion) VALUES  ('YO', 3)
    INSERT INTO @Impresiones (Usuario, Accion) VALUES  ('YO', 4)

    SELECT Usuario,
    (SELECT SUM(e.accion) FROM @Escaneos e WHERE e.Usuario = u.usuario) Escaneos,
    (SELECT SUM(i.accion) FROM @Impresiones i WHERE i.Usuario = u.usuario) Impresiones
    FROM @usuario u

    miércoles, 19 de junio de 2013 15:17
  • Hola.

    ¿Lo resolviste?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    domingo, 23 de junio de 2013 15:59
    Moderador
  • Al parecer, el OP resolvió el problema por él mismo o perdió el interés. Doy el hilo por cerrado.

    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    domingo, 30 de junio de 2013 10:34
    Moderador