none
Registros de los ultimos 6 meses que no esten mas de dos veces RRS feed

  • Pregunta

  • Hola buenas tardes

    Bueno les explico, necesito traer los datos de unos vehiculos en los cuales despues de la venta no hayan venido a su servicio en un periodo de 6 meses, si no ha venido debe presentar la informacion del cliente, si ya tiene un registro dentro de esos 6 meses no presentar.

    Para esto tengo 4 tablas que creo que son las necesarias para sacar esto.

    vehiculos: donde esta registrada la venta, fecha_venta, numero serie, id cliente

    orden: donde esta registrada la orden, fecha_orden, vin , modelo, id cliente, etc

    cliente: donde esta guardado el cliente con su info, idcliente, nombre, telefono, email, etc

    entonces tengo esto pero no me muestra resultados positivos, me muestra muchos aunque tenga 2 y me muestra resultados con fecha_orden menos a los 6 meses.

    ¿Me podrian ayudar?

    select VEH_NUMSERIE,COUNT(*) as veces from SER_VEHICULO inner join SER_ORDEN on VEH_NUMSERIE = ORE_NUMSERIE where ORE_FECHAORD > DATEADD(MONTH,-6,GETDATE()) GROUP BY VEH_NUMSERIE HAVING COUNT(*)<= 1 order by veces

    Gracias de antemano.


    martes, 13 de octubre de 2020 23:18

Todas las respuestas

  • Hola Obtener control creado dinámicamente:

    Cuando haces ese inner join, te estas restringiendo a los vehículos que tengan ordenes en ese plazo, que es precisamente lo que no corresponde.

    Te voy a dar una solución, pero primero el escenario.

    create table ser_vehiculo (veh_numSerie int, cliente int)
    create table ser_orden (id int identity(1,1),ore_numserie int, ore_Fechaord datetime)
    go
    insert into ser_vehiculo (veh_numSerie, cliente)
    values
    (1,100),
    (2,101),
    (3,102),
    (4,102);
    
    Insert into ser_orden (ore_numserie, ore_Fechaord)
    values
    (1,'20200301'),
    (1,'20200401'),
    (1,'20200501'),
    (1,'20200601'),
    (1,'20200701'),
    (2,'20200101'),
    (2,'20200201'),
    (2,'20200301'),
    (3,'20200601'),
    (3,'20200701'),
    (4,'20200101'),
    (4,'20200201'),
    (4,'20200301');
    go

    Las dos tablas con datos ficticios. 4 vehículos, de los cuales el de num_serie 1 y 3 si han ido varias veces en el último semestre y el 2 y 4 no.

    select VEH_NUMSERIE
    	 , orden.veces
    from SER_VEHICULO
    	 OUTER APPLY (
    			   SELECT COUNT(*) As veces
    					  FROM ser_orden AS s
    					  where s.ore_numserie = ser_vehiculo.veh_numSerie 
    							AND ORE_FECHAORD > DATEADD(MONTH, -6, GETDATE())
    				 ) AS orden;

    Resultado.

    El operador apply, se encarga de relacionar los registros del conjunto exterior, en este caso SER_VEHICULO, por la asignación que se hace en su interior (s.ore_numserie = ser_vehiculo.veh_numSerie)

    Operador apply

    https://javifer2.wordpress.com/2020/06/27/operador-apply/

    miércoles, 14 de octubre de 2020 4:36