Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Query me multiplica registros

Estas en el tema de Query me multiplica registros en el foro de SQL Server en Foros del Web. Buen dia, mi problema es que tengo un query que por ejemplo si un usuario tiene de total = 8 le pone 432, son cantidades ...
  #1 (permalink)  
Antiguo 18/06/2013, 10:00
 
Fecha de Ingreso: junio-2013
Mensajes: 8
Antigüedad: 10 años, 10 meses
Puntos: 0
Query me multiplica registros

Buen dia, mi problema es que tengo un query que por ejemplo si un usuario tiene de total = 8 le pone 432, son cantidades exageradas, mi query es el siguiente:
Código SQL:
Ver original
  1. SELECT  u.nombre_usuario
  2. ,  SUM(ISNULL(totalEscaneos,0) +
  3.  ISNULl(totalEscaneosSalida,0) +
  4.  ISNULl(totalEscaneosSinRegistro,0) +
  5.  ISNULl(totalEscaneosSinRegistroSalidaRefri,0) +
  6.  ISNULl(totalEscaneosSinRegistroFifo,0) +
  7.  ISNULl(totalEscaneosSinReposo,0) +
  8.  ISNULL(totalEscaneosEntradaFifo,0) +
  9.  ISNULL(totalEscaneosSalidaFifo,0)) AS Total
  10. , CONVERT(CHAR(10), fecha  , 101)  Fecha
  11.  
  12. FROM tb_usuarios u
  13. LEFT JOIN (
  14.  SELECT id_usuario ,  CONVERT(CHAR(10), tb_escaneos.fecha  , 101) AS fecha, SUM( num_escaneos ) AS totalEscaneos
  15.  FROM tb_escaneos WHERE CONVERT(CHAR(10), tb_escaneos.fecha  , 101) BETWEEN '01/01/2013' AND '06/14/2013' AND fifo IS NULL
  16.  GROUP BY id_usuario ,  CONVERT(CHAR(10), tb_escaneos.fecha  , 101)
  17. ) e ON u.id_usuario = e.id_usuario
  18. LEFT JOIN (
  19.  SELECT  id_usuario ,  CONVERT(CHAR(10), tb_escaneosSalida .fecha  , 101) AS fechaSalida, SUM( num_escaneos ) AS totalEscaneosSalida
  20.  FROM tb_escaneosSalida WHERE CONVERT(CHAR(10), tb_escaneosSalida .fecha  , 101) BETWEEN '01/01/2013' AND '06/14/2013' AND fifo IS NULL
  21.  GROUP BY id_usuario ,  CONVERT(CHAR(10), tb_escaneosSalida .fecha  , 101)
  22. ) es ON u.id_usuario = es.id_usuario
  23. LEFT JOIN (
  24.  SELECT  id_usuario ,  CONVERT(CHAR(10), tb_registros .fecha  , 101) AS fechaSinRegistro, SUM( sin_registroTotal ) AS totalEscaneosSinRegistro
  25.  FROM tb_registros  WHERE CONVERT(CHAR(10), tb_registros  .fecha  , 101) BETWEEN '01/01/2013' AND '06/14/2013'
  26.  GROUP BY id_usuario ,  CONVERT(CHAR(10), tb_registros .fecha  , 101)
  27. ) et ON u.id_usuario = et.id_usuario
  28. LEFT JOIN (
  29.  SELECT  id_usuario , CONVERT(CHAR(10), tb_registros .fecha  , 101) AS fechaSinRegistroSalidaRefri,  SUM( sin_registroSalidaRefri  ) AS totalEscaneosSinRegistroSalidaRefri
  30.  FROM tb_registros  WHERE CONVERT(CHAR(10), tb_registros  .fecha  , 101) BETWEEN '01/01/2013' AND '06/14/2013'
  31.  GROUP BY id_usuario , CONVERT(CHAR(10), tb_registros .fecha  , 101)
  32. ) ete ON u.id_usuario = ete.id_usuario
  33.  
  34. LEFT JOIN (
  35.  SELECT  id_usuario , CONVERT(CHAR(10), tb_registros .fecha  , 101) AS fechaSinRegistroFifo, SUM( sin_registroFifo  ) AS totalEscaneosSinRegistroFifo
  36.  FROM tb_registros  WHERE CONVERT(CHAR(10), tb_registros  .fecha  , 101) BETWEEN '01/01/2013' AND '06/14/2013'
  37.  GROUP BY id_usuario , CONVERT(CHAR(10), tb_registros .fecha  , 101)
  38. ) ele ON u.id_usuario = ele.id_usuario
  39.  
  40. LEFT JOIN (
  41.  SELECT  id_usuario , CONVERT(CHAR(10), tb_registros .fecha  , 101) AS fechaSinReposo, SUM( no_cumplioReposo   ) AS totalEscaneosSinReposo
  42.  FROM tb_registros  WHERE CONVERT(CHAR(10), tb_registros  .fecha  , 101) BETWEEN '01/01/2013' AND '06/14/2013'
  43.  GROUP BY id_usuario, CONVERT(CHAR(10), tb_registros .fecha  , 101)
  44. ) el ON u.id_usuario = el.id_usuario
  45. LEFT JOIN (
  46.  SELECT id_usuario , CONVERT(CHAR(10), tb_escaneos .fecha  , 101) AS fechaEntradaFifo,  SUM( num_escaneos ) AS totalEscaneosEntradaFifo
  47.  FROM tb_escaneos WHERE CONVERT(CHAR(10), tb_escaneos.fecha  , 101) BETWEEN '01/01/2013' AND '06/14/2013' AND fifo = 1
  48.  GROUP BY id_usuario , CONVERT(CHAR(10), tb_escaneos .fecha  , 101)
  49. ) epe ON u.id_usuario = epe.id_usuario
  50. LEFT JOIN (
  51.  SELECT id_usuario , CONVERT(CHAR(10), tb_escaneosSalida  .fecha  , 101) AS fechaSalidaFifo,  SUM( num_escaneos ) AS totalEscaneosSalidaFifo
  52.  FROM tb_escaneosSalida  WHERE CONVERT(CHAR(10), tb_escaneosSalida .fecha  , 101) BETWEEN '01/01/2013' AND '06/14/2013' AND fifo = 1
  53.  GROUP BY id_usuario , CONVERT(CHAR(10), tb_escaneosSalida  .fecha  , 101)
  54. ) eper ON u.id_usuario = eper.id_usuario
  55. GROUP BY
  56. u.nombre_usuario
  57. ,CONVERT(CHAR(10), fecha  , 101)
  58. ORDER BY
  59. u.nombre_usuario
  60. ,CONVERT(CHAR(10), fecha  , 101)


y el resultado es el siguiente:
Código SQL:
Ver original
  1. ADMIN   0   NULL
  2. ADMIN TOTAL 2   05/28/2013
  3. ADMIN TOTAL 2   06/03/2013
  4. Adolfo Martinez Avila   0   NULL
  5. Adrian Martinez 1   NULL
  6. Alejandra Barrera   0   NULL
  7. alfonso samuel  0   NULL
  8. Amairani Cristal    0   NULL
  9. Ana Yanci Morales   0   NULL
  10. Ancelma Hdz 0   NULL
  11. Cesar Araguz    0   NULL
  12. Cricelda Garcia 1   NULL
  13. Crisoforo Santiago  2   NULL
  14. Daniel Diaz Martinez    0   NULL
  15. Deisy cruz  0   NULL
  16. Eliana Beatriz Perez    0   NULL
  17. Fernando David Mendoza  1   NULL
  18. Fernando Jimenez    12  05/29/2013
  19. Fernando Jimenez    3   05/31/2013
  20. Georgina Salazar    0   NULL
  21. Gloria Izaguiire    0   NULL
  22. Irineo Torres   432 NULL
  23. Jaime Ramirez   1   NULL
  24. Jose  Luis Regino   0   NULL
  25. Jose Mario Garcia   5   NULL
  26. Juan Carlos Rojas   0   NULL
  27. Julio Cesar Hdz 40  NULL
  28. Julio Cesar martinez    0   NULL
  29. Julio Rivera    0   NULL
  30. Ma del Carmen Morato    0   NULL
  31. Marcelino Diaz  1   NULL
  32. Maribel Lopez   2   NULL
  33. Maribel Santiago    2   NULL
  34. Monica Guerra   0   NULL
  35. Nelson Garcia   1   NULL
  36. Nohemi Ramirez  0   NULL
  37. Odilon Elizalde 0   NULL
  38. Paulina Lorenzo 0   NULL
  39. Porfirio Gregorio Hdz   0   NULL
  40. Rolando maldonado   5   NULL
  41. Rosa Aidee  0   NULL
  42. samuel perez    0   NULL
  43. Samuel Perez    2   05/30/2013
  44. Samuel Perez    2   06/05/2013
  45. Teodora Cerna   0   NULL
  46. Uriel Lopez 0   NULL
  47. Valentin De la Cruz 1   NULL
  48. Veronica Hernandez  16  NULL
  49. Vicente Garcia  0   NULL
  50. Victor del Angel    0   NULL
  51. Yolanda Dolores 0   NULL

Alguien sabe que es lo que tengo mal para que me pueda dar el numero exacto de totales y no me de cantidades exageradas?

Última edición por gnzsoloyo; 18/06/2013 a las 10:32
  #2 (permalink)  
Antiguo 18/06/2013, 14:18
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Query me multiplica registros

donde esta mal el query seria dificil decirlo asi a "ojo de buen cubero", lo que podria ser es que tu solo identificaras donde esta mal el query, ve quitanto partes y ejecutalo asi veras en que parte es donde te duplica los resultados...

a menos que quieras poner un ejemplo de tus tablas y los datos de tus tablas.....y porque postear en mas de un foro???

http://social.msdn.microsoft.com/For...d-5fe9dd981406

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 19/06/2013, 02:19
Avatar de Joch_pa  
Fecha de Ingreso: octubre-2009
Ubicación: Pachuca De Soto, Hidalgo, Mexico, Mexico
Mensajes: 122
Antigüedad: 14 años, 6 meses
Puntos: 7
Respuesta: Query me multiplica registros

primero creo que seria mejor simplificar tu query {fijate en todos los cambios}
Código SQL:
Ver original
  1. DECLARE @fechaI datetime
  2. DECLARE @fechaF datetime
  3. SET @fechaI = '01/01/2013 00:00:00.000'
  4. SET @fechaF = '06/14/2013 23:59:59.999'
  5.  
  6. SELECT  
  7.     U.nombre_usuario
  8.     ,isnull((
  9.         SELECT SUM( num_escaneos ) AS totalEscaneos
  10.         FROM tb_escaneos A1
  11.         WHERE A1.id_usuario = U.id_usuario
  12.             AND (fifo IS NULL OR fifo = 1)
  13.             AND tb_escaneos.fecha>=@fechaI
  14.             AND tb_escaneos.fecha<=@fechaF
  15.     ),0) +
  16.     isnull((
  17.         SELECT SUM( num_escaneos ) AS totalEscaneosSalida
  18.         FROM tb_escaneosSalida A2
  19.         WHERE A2.id_usuario = U.id_usuario
  20.             AND (fifo IS NULL OR fifo = 1)
  21.             AND tb_escaneosSalida.fecha>=@fechaI
  22.             AND tb_escaneosSalida.fecha<=@fechaF
  23.     ),0) +
  24. ...
  25.     , CONVERT(CHAR(10), fecha  , 101) AS Fecha
  26. FROM tb_usuarios u
  27. GROUP BY
  28. u.nombre_usuario
  29. ,CONVERT(CHAR(10), fecha  , 101)
  30. ORDER BY
  31. u.nombre_usuario
  32. ,CONVERT(CHAR(10), fecha  , 101)

segundo: por verificar que las tablas ocupadas en el query sean las que estés contemplando; pues veo que utilizas varias veces las mismas tablas

tercero: realizar una prueba de escritorio, esto es ejecutar los querys por separado y apuntar el resultado al ultimo realizar la suma, eso te ayudara a descubrir en donde el calculo{persona vs maquina} se esta realizando bien o mal.

por ultimo postea tus resultados o los datos que tienes del usuario Irineo Torres así te podremos ayudar

Etiquetas: sql, sql-sentencia, sql-server-2008
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:50.