Principales respuestas
Union de Querys en SQL Server 2008

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) Fechafrom 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_usuarioleft 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_usuarioleft 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!!
- Editado Alberto López Grande (qwalgrande)Moderator domingo, 30 de junio de 2013 10:32 Errata
miércoles, 19 de junio de 2013 13:29
Respuestas
-
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- Marcado como respuesta Alberto López Grande (qwalgrande)Moderator domingo, 30 de junio de 2013 10:34
domingo, 30 de junio de 2013 10:34Moderador
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 umié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/qwalgrandedomingo, 23 de junio de 2013 15:59Moderador -
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- Marcado como respuesta Alberto López Grande (qwalgrande)Moderator domingo, 30 de junio de 2013 10:34
domingo, 30 de junio de 2013 10:34Moderador