none
Ayuda con subconsulta en sql,tal vez no debo usar una subconsulta en este stored

    Question

  • Holas,primero estas son mis tablas:

    http://img188.imageshack.us/img188/8932/dibujokht.jpg

    Ese es mi stored,solo que tengo un PROBLEMA,EN LO QUE EL CAMPO DURACION

    El problema esta en la tbala pistaauditoria,tengo asi:

     

    Id_Usua Id_Det Id_Event Id_Motivo Fecha Duracion  Observacion
    1 158 4 NULL 03/08/2010   1007  NULL
    1 157 3 4 03/08/2010     0 
     llamada emergencia

     

    1. Necesito  observacion,el motivo,y la duracion,todo bien ,menos x la duracion,que esta en otro registro como ve,estuve pensando en hacer una subconsulta,pero no creo que sea la solucion,porque solo em regresa un valor,y me regresa mas valores.
    2. El evento 3 es que activa suspension,y el 4 cuando desactiva,siempre que tengo evento 4,tengo que coger la duracion,pero como podria hacerlo?he dejado en blanco ese campo.
    3. Como ven arriba,si o si necesito duracion,pero no me deberia repetir registros,como puedo adecuarlo,al stored que tengo,que idea seria?

    --————————————————————————————————————————————————————————————————————————————————————————————————————               
                      
    --Funcionalidad  :Recupera el motivo de suspensión de inactividad del sistema . Anexo 5                         
    --————————————————————————————————————————————————————————————————————————————————————————————————————                
    ALTER PROCEDURE [dbo].[Reporte_Rpt_SGC005]  '01/08/2010','30/08/2010'  
    @FechaInicio VARCHAR(10),          
    @FechaFin VARCHAR(10)
    AS        
    SET DATEFORMAT DMY           
    SELECT 
    'FechaMotivo'= dbo.Fecha(PA.Fecha)
    ,'UsuarioNombre'= U.NOM_USUA
    ,'Duracion'=''
     ,'MotivoNombre'=ISNULL( M.Descripcion,'')
    ,'Observacion'=ISNULL(PA.Observacion,'') 
    FROM Tbl_PistasAuditoria PA
    LEFT JOIN Tbl_Motivo M
    ON PA.Id_Motivo=M.Id_Motivo
    INNER JOIN Tbl_Usuarios U
    ON U.ID_USUA=PA.Id_Usua
    WHERE (PA.Id_Event=3  )
    AND (dbo.Fecha112(PA.Fecha) BETWEEN dbo.Fecha112(@FechaInicio) AND dbo.Fecha112(@FechaFin))                          
    GROUP BY U.NOM_USUA,dbo.Fecha(PA.Fecha),dbo.intHhMmStr(PA.Duracion),ISNULL( M.Descripcion,''),ISNULL(PA.Observacion,'') 
    ORDER BY 'FechaMotivo' DESC

    Gracias.

    Slds.

     

     


    Estudiante_Sistemas
    Tuesday, August 03, 2010 5:54 PM

Answers

  • Varias cosas que creo deberias tener en cuenta...

     1.- (dbo.Fecha112(PA.Fecha) BETWEEN dbo.Fecha112(@FechaInicio) AND dbo.Fecha112(@FechaFin))     usar funciones para esto, hace que sea imposible usar un índice.. además de no aportar gran cosa si el tipo de datos es el adecuado. Si tienes alguna duda sobre tratamiento de fechas.. estás en el foro adecuado, si lo que pasa es que tienes fechas y horas y quieres algo concreto.. pues preguntalo, pero por favor evita tanto como puedas estas construcciones. Solo te darán problemas de rendimiento.

    2.- Si en la tabla ya tienes la fecha de inicio y de fin de la incidencia, con una resta (fechafin-fechainico) o con la función datediff puedes saber el tiempo transcurrido, no necesitas más regitros.

    3.- Si por el contrario la fecha de fin anda por otro registro.. entonces si necesitas una subconsulta... que podría ser algo así como

    select a,b,(select max(fechaFin) from lamismatabla where lamismatabla.clave1=tabla.clave1 and lamismatabla.clave2 = tabla.clave2.... ) from tabla

    (espero se entienda), Luego simplemente haces el datediff o la diferencia y listo.

     

    ¿es eso lo que buscas?


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    • Marked as answer by Rosita_Lima Wednesday, August 04, 2010 4:03 PM
    Wednesday, August 04, 2010 3:17 PM
    Moderator

All replies

  • No veo dónde está la repetición de los registros, ya que hay campos que tienen valores diferentes.
    Wednesday, August 04, 2010 7:36 AM
  • Varias cosas que creo deberias tener en cuenta...

     1.- (dbo.Fecha112(PA.Fecha) BETWEEN dbo.Fecha112(@FechaInicio) AND dbo.Fecha112(@FechaFin))     usar funciones para esto, hace que sea imposible usar un índice.. además de no aportar gran cosa si el tipo de datos es el adecuado. Si tienes alguna duda sobre tratamiento de fechas.. estás en el foro adecuado, si lo que pasa es que tienes fechas y horas y quieres algo concreto.. pues preguntalo, pero por favor evita tanto como puedas estas construcciones. Solo te darán problemas de rendimiento.

    2.- Si en la tabla ya tienes la fecha de inicio y de fin de la incidencia, con una resta (fechafin-fechainico) o con la función datediff puedes saber el tiempo transcurrido, no necesitas más regitros.

    3.- Si por el contrario la fecha de fin anda por otro registro.. entonces si necesitas una subconsulta... que podría ser algo así como

    select a,b,(select max(fechaFin) from lamismatabla where lamismatabla.clave1=tabla.clave1 and lamismatabla.clave2 = tabla.clave2.... ) from tabla

    (espero se entienda), Luego simplemente haces el datediff o la diferencia y listo.

     

    ¿es eso lo que buscas?


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    • Marked as answer by Rosita_Lima Wednesday, August 04, 2010 4:03 PM
    Wednesday, August 04, 2010 3:17 PM
    Moderator
  • Hola interesante tu respuesta,pero,ya hice algo que funciona,simplemente actualizo el campo duracion ,cuando activa el ssitemay dodne habia 0 ,ya tengo el valor que queria,el datediff lo hago a travez del visual.

    Gracias,x tus observaciones.

     


    Estudiante_Sistemas
    Wednesday, August 04, 2010 4:04 PM