How to bring salespeople who did and did not make sales yesterday?

1

In this select I am bringing all the employees who accessed the application yesterday PO.DAT_COLETA and who performed yesterday PE.COD_PEDIDO . But I also want to bring those who accessed yesterday and did not make sales, today I do this for PROCV in excel, is it possible to do this by the query?

 SELECT

     FUV.COD_UNIDADE_VENDA
    ,UV.NOM_UNIDADE_VENDA
    ,FUV.COD_FUNCIONARIO
    ,FU.NOM_FUNCIONARIO
    ,PO.DAT_COLETA
    ,PE.COD_PEDIDO

    FROM FUNCIONARIO_UNIDADE_VENDA FUV

    JOIN POSICAO_FUNCIONARIO PO ON FUV.COD_FUNCIONARIO = PO.COD_FUNCIONARIO
    JOIN UNIDADE_VENDA UV ON FUV.COD_UNIDADE_VENDA = UV.COD_UNIDADE_VENDA
    JOIN FUNCIONARIO FU ON FUV.COD_FUNCIONARIO = FU.COD_FUNCIONARIO
    JOIN PEDIDO PE ON FUV.COD_FUNCIONARIO = PE.COD_FUNCIONARIO

    WHERE 
    PO.DAT_COLETA >= CONVERT(CHAR(10), GETDATE()-1, 101) and PO.DAT_COLETA < CONVERT(CHAR(10), GETDATE(), 101) 
AND PE.DAT_ENTREGA >= CONVERT(CHAR(10), GETDATE()-1, 101) and PE.DAT_ENTREGA < CONVERT(CHAR(10), GETDATE(), 101) 

    ORDER BY FUV.COD_UNIDADE_VENDA
    
asked by anonymous 02.02.2017 / 13:01

3 answers

2

That's a suggestion, given the information available.

-- código #1 v3
-- obtém horários de limite do dia 
declare @Data1 datetime, @Data2 datetime;
set @Data1= Cast(Current_timestamp as date);
set @Data2= DateAdd(ms, -3, DateAdd(day, +1, @Data1));

--
SELECT FUV.COD_UNIDADE_VENDA, UV.NOM_UNIDADE_VENDA,
       PO.COD_FUNCIONARIO, FU.NOM_FUNCIONARIO,
       case when exists (SELECT * from PEDIDO as PE 
                         where PE.COD_FUNCIONARIO = PO.COD_FUNCIONARIO
                               and PE.DAT_ENTREGA between @Data1 and @Data2)
            then 'Vendeu' 
            else 'Não vendeu' end as Status
  from POSICAO_FUNCIONARIO as PO
       inner join FUNCIONARIO_UNIDADE_VENDA as FUV on FUV.COD_FUNCIONARIO = PO.COD_FUNCIONARIO
       inner join UNIDADE_VENDA as UV on FUV.COD_UNIDADE_VENDA = UV.COD_UNIDADE_VENDA
       inner join FUNCIONARIO as FU on FU.COD_FUNCIONARIO = PO.COD_FUNCIONARIO
  where PO.DAT_COLETA between @Data1 and @Data2
  order by FUV.COD_UNIDADE_VENDA asc, Status desc, PO.COD_FUNCIONARIO asc;

The suggestion assumes that:

  • Multiple orders can be registered on the same day for one employee;
  • the DAT_COLETA and DAT_ENTREGA columns are declared as datetime.
02.02.2017 / 20:00
3

Yes it is possible, make a UNION the first one you already have that is the ones that made the sale, the second one does almost the same thing, however, without a purchase order.

/* FUNCIONARIOS QUE REALIZARAM VENDA */
SELECT
 FUV.COD_UNIDADE_VENDA
,UV.NOM_UNIDADE_VENDA
,FUV.COD_FUNCIONARIO
,FU.NOM_FUNCIONARIO
,PO.DAT_COLETA
,PE.COD_PEDIDO
FROM FUNCIONARIO_UNIDADE_VENDA FUV
JOIN POSICAO_FUNCIONARIO PO ON FUV.COD_FUNCIONARIO = PO.COD_FUNCIONARIO
JOIN UNIDADE_VENDA UV ON FUV.COD_UNIDADE_VENDA = UV.COD_UNIDADE_VENDA
JOIN FUNCIONARIO FU ON FUV.COD_FUNCIONARIO = FU.COD_FUNCIONARIO
JOIN PEDIDO PE ON FUV.COD_FUNCIONARIO = PE.COD_FUNCIONARIO
WHERE PO.DAT_COLETA >= CONVERT(CHAR(10), GETDATE()-1, 101) and PO.DAT_COLETA    < CONVERT(CHAR(10), GETDATE(), 101) 
AND PE.DAT_ENTREGA >= CONVERT(CHAR(10), GETDATE()-1, 101) and PE.DAT_ENTREGA < CONVERT(CHAR(10), GETDATE(), 101) 
UNION
/* FUNCIONARIOS QUE NÃO REALIZARAM VENDA */
SELECT
 FUV.COD_UNIDADE_VENDA
,UV.NOM_UNIDADE_VENDA
,FUV.COD_FUNCIONARIO
,FU.NOM_FUNCIONARIO
,PO.DAT_COLETA
,0 AS COD_PEDIDO
  FROM FUNCIONARIO_UNIDADE_VENDA FUV
 JOIN POSICAO_FUNCIONARIO PO ON FUV.COD_FUNCIONARIO = PO.COD_FUNCIONARIO
 JOIN UNIDADE_VENDA UV ON FUV.COD_UNIDADE_VENDA = UV.COD_UNIDADE_VENDA
 JOIN FUNCIONARIO FU ON FUV.COD_FUNCIONARIO = FU.COD_FUNCIONARIO
 WHERE PO.DAT_COLETA >= CONVERT(CHAR(10), GETDATE()-1, 101) and  PO.DAT_COLETA < CONVERT(CHAR(10), GETDATE(), 101) 
 ORDER BY 1

You can also do this using LEFT JOIN with the 'ORDER' table, so if there is no order, the order number field will be null.

    
02.02.2017 / 13:10
0
SELECT

 FUV.COD_UNIDADE_VENDA
,UV.NOM_UNIDADE_VENDA
,FUV.COD_FUNCIONARIO
,FU.NOM_FUNCIONARIO
,PO.DAT_COLETA
,PE.COD_PEDIDO

FROM FUNCIONARIO_UNIDADE_VENDA FUV

JOIN POSICAO_FUNCIONARIO PO ON FUV.COD_FUNCIONARIO = PO.COD_FUNCIONARIO
JOIN UNIDADE_VENDA UV ON FUV.COD_UNIDADE_VENDA = UV.COD_UNIDADE_VENDA
JOIN FUNCIONARIO FU ON FUV.COD_FUNCIONARIO = FU.COD_FUNCIONARIO
LEFT JOIN PEDIDO PE ON FUV.COD_FUNCIONARIO = PE.COD_FUNCIONARIO

WHERE 
PO.DAT_COLETA >= CONVERT(CHAR(10), GETDATE()-1, 101) and PO.DAT_COLETA < CONVERT(CHAR(10), GETDATE(), 101) AND PE.DAT_ENTREGA >= CONVERT(CHAR(10), GETDATE()-1, 101) and PE.DAT_ENTREGA < CONVERT(CHAR(10), GETDATE(), 101) 
ORDER BY FUV.COD_UNIDADE_VENDA

Another option is to use LEFT JOIN.

    
02.02.2017 / 15:19