Script/Categoria_clientes.sql

1082 lines
30 KiB
MySQL

----------------------------
fCategoria
----------------------------
WITH PERIODOS AS (
SELECT
LEVEL AS ID_PERIODO,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1)) AS MES_REF,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -LEVEL) AS MES_ANALISE,
ADD_MONTHS(
TRUNC(ADD_MONTHS(TRUNC(SYSDATE,'MM'), -LEVEL), 'MM'),
-11
) AS DATA_INICIO,
LAST_DAY(
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -LEVEL)
) AS DATA_FIM
FROM DUAL
CONNECT BY LEVEL <= 12
),
PARAMETROS AS (
SELECT
MAX(CASE WHEN NOME = 'CON_FREQUENCIACLIENTE'
THEN VALOR END) AS CON_FREQUENCIACLIENTE,
MAX(CASE WHEN NOME = 'CON_FATURAMENTOCATCLIENTE'
THEN VALOR END) AS CON_FATURAMENTOCATCLIENTE
FROM PCPARAMFILIAL
),
PARAM_CATEGORIA_TICKET AS (
SELECT
500 AS LIM_TICKET_VALOR,
3 AS LIM_TICKET_FREQUENCIA
FROM DUAL
),
FATURAMENTO AS (
SELECT
P.ID_PERIODO,
NF.CODCLI,
SUM(NF.VLATEND) AS FATURAMENTO_BRUTO,
SUM(NF.VLCUSTOFIN) AS CUSTO_BRUTO
FROM VIEW_VENDAS_RESUMO_FATURAMENTO NF
JOIN PERIODOS P
ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
GROUP BY
P.ID_PERIODO,
NF.CODCLI
),
DEVOLUCAO AS (
SELECT
P.ID_PERIODO,
DV.CODCLI,
SUM(DV.VLDEVOLUCAO) AS DEVOLUCAO,
SUM(DV.VLCMVDEVOL) AS CUSTO_DEVOL
FROM VIEW_DEVOL_RESUMO_FATURAMENTO DV
JOIN PERIODOS P
ON DV.DTENT BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE DV.DTCANCEL IS NULL
AND DV.CONDVENDA IN (1,7)
GROUP BY
P.ID_PERIODO,
DV.CODCLI
),
FREQUENCIA AS (
SELECT
P.ID_PERIODO,
NF.CODCLI,
COUNT(DISTINCT NF.NUMTRANSVENDA) AS FREQUENCIA
FROM VIEW_VENDAS_RESUMO_FATURAMENTO NF
JOIN PERIODOS P
ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
GROUP BY
P.ID_PERIODO,
NF.CODCLI
),
FREQ_VENDEDOR AS (
SELECT
P.ID_PERIODO,
NF.CODCLI,
NF.CODUSUR AS CODVEND,
COUNT(DISTINCT NF.NUMTRANSVENDA) AS FREQUENCIA_VENDEDOR
FROM PCNFSAID NF
JOIN PERIODOS P
ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
GROUP BY
P.ID_PERIODO,
NF.CODCLI,
NF.CODUSUR
),
VENDEDOR_PRINCIPAL AS (
SELECT
V.ID_PERIODO,
V.CODCLI,
V.CODVEND,
U.NOME AS NOME_VENDEDOR,
V.FREQUENCIA_VENDEDOR,
ROW_NUMBER() OVER (
PARTITION BY V.ID_PERIODO, V.CODCLI
ORDER BY V.FREQUENCIA_VENDEDOR DESC
) AS RN
FROM FREQ_VENDEDOR V
LEFT JOIN PCUSUARI U
ON U.CODUSUR = V.CODVEND
),
BASE AS (
SELECT
P.ID_PERIODO,
TO_CHAR(P.MES_REF,'MM/YYYY') AS PERIODO_REFERENCIA,
F.CODCLI,
CLI.CLIENTE,
CASE
WHEN CLI.TIPOFJ = 'F' THEN 'Física'
WHEN CLI.TIPOFJ = 'J' THEN 'Jurídica'
ELSE 'Não informado'
END AS TIPO_PESSOA,
NVL(FR.FREQUENCIA,0) AS FREQUENCIA,
NVL(F.FATURAMENTO_BRUTO,0) AS FATURAMENTO_BRUTO,
NVL(D.DEVOLUCAO,0) AS DEVOLUCAO,
NVL(F.FATURAMENTO_BRUTO,0) - NVL(D.DEVOLUCAO,0) AS FATURAMENTO_LIQUIDO,
NVL(F.CUSTO_BRUTO,0) - NVL(D.CUSTO_DEVOL,0) AS CUSTO_LIQUIDO,
ROUND(
(
(NVL(F.FATURAMENTO_BRUTO,0))
- (NVL(F.CUSTO_BRUTO,0))
)
/
NULLIF((NVL(F.FATURAMENTO_BRUTO,0)),0),
4) AS PERCENT_MARGEM,
ROUND(
NVL(F.FATURAMENTO_BRUTO,0)
/
NULLIF(FR.FREQUENCIA,0),
2) AS TICKET_MEDIO,
VP.CODVEND AS CODVEND_PRINCIPAL,
VP.NOME_VENDEDOR AS VENDEDOR_PRINCIPAL,
VP.FREQUENCIA_VENDEDOR,
ROUND(
VP.FREQUENCIA_VENDEDOR
/
NULLIF(FR.FREQUENCIA,0),
4) AS PERC_COMPRAS_VENDEDOR_PRINCIPAL,
P2.CON_FATURAMENTOCATCLIENTE,
P2.CON_FREQUENCIACLIENTE,
PC.LIM_TICKET_VALOR,
PC.LIM_TICKET_FREQUENCIA
FROM PERIODOS P
JOIN FATURAMENTO F ON F.ID_PERIODO = P.ID_PERIODO
JOIN PCCLIENT CLI ON CLI.CODCLI = F.CODCLI
LEFT JOIN DEVOLUCAO D ON D.ID_PERIODO = F.ID_PERIODO AND D.CODCLI = F.CODCLI
LEFT JOIN FREQUENCIA FR ON FR.ID_PERIODO = F.ID_PERIODO AND FR.CODCLI = F.CODCLI
LEFT JOIN VENDEDOR_PRINCIPAL VP
ON VP.ID_PERIODO = F.ID_PERIODO
AND VP.CODCLI = F.CODCLI
AND VP.RN = 1
CROSS JOIN PARAMETROS P2
CROSS JOIN PARAM_CATEGORIA_TICKET PC
)
SELECT
ID_PERIODO,
PERIODO_REFERENCIA,
CODCLI,
CLIENTE,
TIPO_PESSOA,
FREQUENCIA,
FATURAMENTO_BRUTO,
DEVOLUCAO,
FATURAMENTO_LIQUIDO,
CUSTO_LIQUIDO,
TICKET_MEDIO,
CODVEND_PRINCIPAL,
VENDEDOR_PRINCIPAL,
FREQUENCIA_VENDEDOR,
PERC_COMPRAS_VENDEDOR_PRINCIPAL,
CASE
WHEN FATURAMENTO_LIQUIDO > CON_FATURAMENTOCATCLIENTE
AND FREQUENCIA > CON_FREQUENCIACLIENTE
THEN 'DIAMANTE'
WHEN FATURAMENTO_LIQUIDO > CON_FATURAMENTOCATCLIENTE
AND FREQUENCIA <= CON_FREQUENCIACLIENTE
THEN 'OURO'
WHEN FATURAMENTO_LIQUIDO <= CON_FATURAMENTOCATCLIENTE
AND FREQUENCIA > CON_FREQUENCIACLIENTE
THEN 'PRATA'
ELSE 'BRONZE'
END AS CATEGORIA_FATURAMENTO,
CASE
WHEN TICKET_MEDIO > LIM_TICKET_VALOR
AND FREQUENCIA > LIM_TICKET_FREQUENCIA
THEN 'DIAMANTE'
WHEN TICKET_MEDIO > LIM_TICKET_VALOR
AND FREQUENCIA <= LIM_TICKET_FREQUENCIA
THEN 'OURO'
WHEN TICKET_MEDIO <= LIM_TICKET_VALOR
AND FREQUENCIA > LIM_TICKET_FREQUENCIA
THEN 'PRATA'
ELSE 'BRONZE'
END AS CATEGORIA_TICKET,
PERCENT_MARGEM
FROM BASE
WHERE CODCLI NOT IN (1,2)
ORDER BY
ID_PERIODO,
FATURAMENTO_LIQUIDO DESC;
--------------------------
fTopProdCli
--------------------------
WITH PERIODOS AS (
SELECT
LEVEL AS ID_PERIODO,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1)) AS MES_REF,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL+10)) AS DATA_INICIO,
LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1))) AS DATA_FIM
FROM DUAL
CONNECT BY LEVEL <= 12
),
ITENS_CLIENTE AS (
SELECT
P.ID_PERIODO,
P.MES_REF,
NF.CODCLI,
M.CODPROD,
PR.DESCRICAO AS PRODUTO,
SUM(M.QT) AS QTD_VENDIDA,
SUM(M.QT * M.PUNIT) AS FATURAMENTO_PRODUTO,
SUM(M.QT * M.CUSTOFIN) AS CUSTO_PRODUTO
FROM PCNFSAID NF
JOIN PCMOV M
ON M.NUMTRANSVENDA = NF.NUMTRANSVENDA
JOIN PCPRODUT PR
ON PR.CODPROD = M.CODPROD
JOIN PERIODOS P
ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
AND NF.CODCLI NOT IN (1,2)
GROUP BY
P.ID_PERIODO,
P.MES_REF,
NF.CODCLI,
M.CODPROD,
PR.DESCRICAO
),
DEVOLUCAO AS (
SELECT
P.ID_PERIODO,
DV.CODCLI,
DV.CODPROD,
SUM(DV.VLDEVOLUCAO) AS VLR_DEVOLUCAO
FROM VIEW_DEVOL_RESUMO_FATURAMENTO DV
JOIN PERIODOS P
ON DV.DTENT BETWEEN P.DATA_INICIO AND P.DATA_FIM
GROUP BY
P.ID_PERIODO,
DV.CODCLI,
DV.CODPROD
),
BASE AS (
SELECT
I.ID_PERIODO,
I.MES_REF,
I.CODCLI,
I.CODPROD,
I.PRODUTO,
I.QTD_VENDIDA,
I.FATURAMENTO_PRODUTO,
I.CUSTO_PRODUTO,
(I.FATURAMENTO_PRODUTO - NVL(D.VLR_DEVOLUCAO,0)) AS FATURAMENTO_LIQUIDO
FROM ITENS_CLIENTE I
LEFT JOIN DEVOLUCAO D
ON D.ID_PERIODO = I.ID_PERIODO
AND D.CODCLI = I.CODCLI
AND D.CODPROD = I.CODPROD
),
BASE_FILTRADA AS (
SELECT *
FROM BASE
WHERE FATURAMENTO_LIQUIDO > 0
),
RANKED AS (
SELECT
ID_PERIODO,
MES_REF,
CODCLI,
CODPROD,
PRODUTO,
QTD_VENDIDA,
FATURAMENTO_LIQUIDO,
CUSTO_PRODUTO,
(FATURAMENTO_LIQUIDO - CUSTO_PRODUTO) AS LUCRO_PRODUTO,
ROUND(
(FATURAMENTO_LIQUIDO - CUSTO_PRODUTO)
/ FATURAMENTO_LIQUIDO,
4) AS MARGEM_PERC,
ROW_NUMBER() OVER (
PARTITION BY ID_PERIODO, CODCLI
ORDER BY FATURAMENTO_LIQUIDO DESC
) AS POSICAO
FROM BASE_FILTRADA
)
SELECT
ID_PERIODO,
TO_CHAR(MES_REF, 'MM/YYYY') AS PERIODO_REFERENCIA,
CODCLI,
CODPROD,
PRODUTO,
QTD_VENDIDA,
FATURAMENTO_LIQUIDO,
CUSTO_PRODUTO,
LUCRO_PRODUTO,
MARGEM_PERC,
POSICAO
FROM RANKED
WHERE POSICAO <= 5
ORDER BY
CODCLI,
POSICAO;
----------------------
fTopProdCateg
----------------------
WITH PERIODOS AS (
SELECT
LEVEL AS ID_PERIODO,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1)) AS MES_REF,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL+10)) AS DATA_INICIO,
LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1))) AS DATA_FIM
FROM DUAL
CONNECT BY LEVEL <= 12
),
PARAMETROS AS (
SELECT
MAX(CASE WHEN NOME = 'CON_FREQUENCIACLIENTE'
THEN VALOR END) AS CON_FREQUENCIACLIENTE,
MAX(CASE WHEN NOME = 'CON_FATURAMENTOCATCLIENTE'
THEN VALOR END) AS CON_FATURAMENTOCATCLIENTE
FROM PCPARAMFILIAL
),
FATURAMENTO_CLIENTE AS (
SELECT
P.ID_PERIODO,
P.MES_REF,
NF.CODCLI,
SUM(NF.VLATEND) AS FATURAMENTO_BRUTO
FROM VIEW_VENDAS_RESUMO_FATURAMENTO NF
JOIN PERIODOS P
ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
GROUP BY
P.ID_PERIODO,
P.MES_REF,
NF.CODCLI
),
DEVOLUCAO_CLIENTE AS (
SELECT
P.ID_PERIODO,
DV.CODCLI,
SUM(DV.VLVENDA) * -1 AS DEVOLUCAO
FROM VB_DEVOLUCAO DV
JOIN PERIODOS P
ON DV.DTVENDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
GROUP BY
P.ID_PERIODO,
DV.CODCLI
),
FREQUENCIA_CLIENTE AS (
SELECT
P.ID_PERIODO,
NF.CODCLI,
COUNT(NF.NUMNOTA) AS FREQUENCIA
FROM PCNFSAID NF
JOIN PERIODOS P
ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
GROUP BY
P.ID_PERIODO,
NF.CODCLI
),
CLIENTES_CATEGORIZADOS AS (
SELECT
F.ID_PERIODO,
F.MES_REF,
F.CODCLI,
(NVL(F.FATURAMENTO_BRUTO,0) - NVL(D.DEVOLUCAO,0)) AS FATURAMENTO_LIQUIDO,
NVL(FR.FREQUENCIA,0) AS FREQUENCIA,
CASE
WHEN (NVL(F.FATURAMENTO_BRUTO,0) - NVL(D.DEVOLUCAO,0)) > P.CON_FATURAMENTOCATCLIENTE
AND NVL(FR.FREQUENCIA,0) > P.CON_FREQUENCIACLIENTE
THEN 'DIAMANTE'
WHEN (NVL(F.FATURAMENTO_BRUTO,0) - NVL(D.DEVOLUCAO,0)) > P.CON_FATURAMENTOCATCLIENTE
AND NVL(FR.FREQUENCIA,0) <= P.CON_FREQUENCIACLIENTE
THEN 'OURO'
WHEN (NVL(F.FATURAMENTO_BRUTO,0) - NVL(D.DEVOLUCAO,0)) <= P.CON_FATURAMENTOCATCLIENTE
AND NVL(FR.FREQUENCIA,0) > P.CON_FREQUENCIACLIENTE
THEN 'PRATA'
ELSE 'BRONZE'
END AS CATEGORIA_CLIENTE
FROM FATURAMENTO_CLIENTE F
LEFT JOIN DEVOLUCAO_CLIENTE D
ON D.ID_PERIODO = F.ID_PERIODO
AND D.CODCLI = F.CODCLI
LEFT JOIN FREQUENCIA_CLIENTE FR
ON FR.ID_PERIODO = F.ID_PERIODO
AND FR.CODCLI = F.CODCLI
CROSS JOIN PARAMETROS P
),
ITENS_CLIENTE AS (
SELECT
P.ID_PERIODO,
P.MES_REF,
NF.CODCLI,
M.CODPROD,
PR.DESCRICAO AS PRODUTO,
SUM(M.QT) AS QTD_VENDIDA,
SUM(M.QT * M.PUNIT) AS FATURAMENTO_PRODUTO,
SUM(M.QT * M.CUSTOFIN) AS CUSTO_PRODUTO
FROM PCNFSAID NF
JOIN PCMOV M ON M.NUMTRANSVENDA = NF.NUMTRANSVENDA
JOIN PCPRODUT PR ON PR.CODPROD = M.CODPROD
JOIN PERIODOS P ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
AND PR.CODPROD NOT IN (48500)
AND PR.DESCRICAO NOT LIKE '++%'
AND PR.DESCRICAO NOT LIKE '$%'
GROUP BY
P.ID_PERIODO,
P.MES_REF,
NF.CODCLI,
M.CODPROD,
PR.DESCRICAO
),
PRODUTOS_POR_CATEGORIA AS (
SELECT
C.ID_PERIODO,
C.MES_REF,
C.CATEGORIA_CLIENTE,
I.CODPROD,
I.PRODUTO,
SUM(I.QTD_VENDIDA) AS QTD_TOTAL,
SUM(I.FATURAMENTO_PRODUTO) AS FAT_TOTAL,
SUM(I.CUSTO_PRODUTO) AS CUSTO_TOTAL
FROM ITENS_CLIENTE I
JOIN CLIENTES_CATEGORIZADOS C
ON C.ID_PERIODO = I.ID_PERIODO
AND C.CODCLI = I.CODCLI
GROUP BY
C.ID_PERIODO,
C.MES_REF,
C.CATEGORIA_CLIENTE,
I.CODPROD,
I.PRODUTO
),
RANKED AS (
SELECT
ID_PERIODO,
MES_REF,
CATEGORIA_CLIENTE,
CODPROD,
PRODUTO,
QTD_TOTAL,
FAT_TOTAL,
CUSTO_TOTAL,
ROUND(
CASE
WHEN FAT_TOTAL > 0
THEN (FAT_TOTAL - CUSTO_TOTAL) / FAT_TOTAL
ELSE 0
END
, 4) AS MARGEM_PERC,
RANK() OVER (
PARTITION BY ID_PERIODO, CATEGORIA_CLIENTE
ORDER BY FAT_TOTAL DESC
) AS POSICAO
FROM PRODUTOS_POR_CATEGORIA
)
SELECT
ID_PERIODO,
TO_CHAR(MES_REF, 'MM/YYYY') AS PERIODO_REFERENCIA,
CATEGORIA_CLIENTE,
POSICAO,
CODPROD,
PRODUTO,
QTD_TOTAL,
FAT_TOTAL,
CUSTO_TOTAL,
MARGEM_PERC
FROM RANKED
WHERE POSICAO <= 20
ORDER BY
ID_PERIODO,
CATEGORIA_CLIENTE,
POSICAO;
----------------------------
fTopProdCategTicket
----------------------------
WITH PERIODOS AS (
SELECT
LEVEL AS ID_PERIODO,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1)) AS MES_REF,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL+10)) AS DATA_INICIO,
LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1))) AS DATA_FIM
FROM DUAL
CONNECT BY LEVEL <= 12
),
PARAM_CATEGORIA_TICKET AS (
SELECT
500 AS LIM_TICKET_VALOR,
3 AS LIM_TICKET_FREQUENCIA
FROM DUAL
),
FATURAMENTO AS (
SELECT
P.ID_PERIODO,
NF.CODCLI,
SUM(NF.VLATEND) AS FATURAMENTO_BRUTO
FROM VIEW_VENDAS_RESUMO_FATURAMENTO NF
JOIN PERIODOS P
ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
GROUP BY
P.ID_PERIODO,
NF.CODCLI
),
DEVOLUCAO AS (
SELECT
P.ID_PERIODO,
DV.CODCLI,
SUM(DV.VLDEVOLUCAO) AS DEVOLUCAO
FROM VIEW_DEVOL_RESUMO_FATURAMENTO DV
JOIN PERIODOS P
ON DV.DTENT BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE DV.DTCANCEL IS NULL
AND DV.CONDVENDA IN (1,7)
GROUP BY
P.ID_PERIODO,
DV.CODCLI
),
FREQUENCIA AS (
SELECT
P.ID_PERIODO,
NF.CODCLI,
COUNT(DISTINCT NF.NUMTRANSVENDA) AS FREQUENCIA
FROM VIEW_VENDAS_RESUMO_FATURAMENTO NF
JOIN PERIODOS P
ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
GROUP BY
P.ID_PERIODO,
NF.CODCLI
),
CLIENTE_TICKET AS (
SELECT
F.ID_PERIODO,
F.CODCLI,
(NVL(F.FATURAMENTO_BRUTO,0) - NVL(D.DEVOLUCAO,0)) AS FATURAMENTO_LIQUIDO,
FR.FREQUENCIA,
ROUND(
(NVL(F.FATURAMENTO_BRUTO,0) - NVL(D.DEVOLUCAO,0))
/ NULLIF(FR.FREQUENCIA,0),
2) AS TICKET_MEDIO,
CASE
WHEN ROUND(
(NVL(F.FATURAMENTO_BRUTO,0) - NVL(D.DEVOLUCAO,0))
/ NULLIF(FR.FREQUENCIA,0),2
) >= PT.LIM_TICKET_VALOR
AND FR.FREQUENCIA >= PT.LIM_TICKET_FREQUENCIA
THEN 'DIAMANTE'
WHEN ROUND(
(NVL(F.FATURAMENTO_BRUTO,0) - NVL(D.DEVOLUCAO,0))
/ NULLIF(FR.FREQUENCIA,0),2
) < PT.LIM_TICKET_VALOR
AND FR.FREQUENCIA >= PT.LIM_TICKET_FREQUENCIA
THEN 'PRATA'
WHEN ROUND(
(NVL(F.FATURAMENTO_BRUTO,0) - NVL(D.DEVOLUCAO,0))
/ NULLIF(FR.FREQUENCIA,0),2
) >= PT.LIM_TICKET_VALOR
AND FR.FREQUENCIA < PT.LIM_TICKET_FREQUENCIA
THEN 'OURO'
ELSE 'BRONZE'
END AS CATEGORIA_TICKET
FROM FATURAMENTO F
LEFT JOIN DEVOLUCAO D
ON D.ID_PERIODO = F.ID_PERIODO
AND D.CODCLI = F.CODCLI
LEFT JOIN FREQUENCIA FR
ON FR.ID_PERIODO = F.ID_PERIODO
AND FR.CODCLI = F.CODCLI
CROSS JOIN PARAM_CATEGORIA_TICKET PT
),
ITENS_CLIENTE AS (
SELECT
P.ID_PERIODO,
P.MES_REF,
NF.CODCLI,
M.CODPROD,
PR.DESCRICAO AS PRODUTO,
SUM(M.QT * M.PUNIT) AS FATURAMENTO_PRODUTO,
SUM(M.QT * M.CUSTOFIN) AS CUSTO_PRODUTO
FROM PCNFSAID NF
JOIN PCMOV M ON M.NUMTRANSVENDA = NF.NUMTRANSVENDA
JOIN PCPRODUT PR ON PR.CODPROD = M.CODPROD
JOIN PERIODOS P ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
AND PR.CODPROD NOT IN (48500)
AND PR.DESCRICAO NOT LIKE '++%'
AND PR.DESCRICAO NOT LIKE '$%'
GROUP BY
P.ID_PERIODO,
P.MES_REF,
NF.CODCLI,
M.CODPROD,
PR.DESCRICAO
),
PRODUTO_CATEGORIA AS (
SELECT
I.ID_PERIODO,
I.MES_REF,
C.CATEGORIA_TICKET,
I.CODPROD,
I.PRODUTO,
SUM(I.FATURAMENTO_PRODUTO) AS FAT_TOTAL,
SUM(I.CUSTO_PRODUTO) AS CUSTO_TOTAL
FROM ITENS_CLIENTE I
JOIN CLIENTE_TICKET C
ON C.ID_PERIODO = I.ID_PERIODO
AND C.CODCLI = I.CODCLI
GROUP BY
I.ID_PERIODO,
I.MES_REF,
C.CATEGORIA_TICKET,
I.CODPROD,
I.PRODUTO
),
RANKED AS (
SELECT
ID_PERIODO,
TO_CHAR(MES_REF,'MM/YYYY') AS PERIODO_REFERENCIA,
CATEGORIA_TICKET,
CODPROD,
PRODUTO,
FAT_TOTAL,
ROUND(
CASE
WHEN FAT_TOTAL > 0
THEN (FAT_TOTAL - CUSTO_TOTAL) / FAT_TOTAL
ELSE 0
END,
4) AS MARGEM_PERC,
RANK() OVER (
PARTITION BY ID_PERIODO, CATEGORIA_TICKET
ORDER BY FAT_TOTAL DESC
) AS POSICAO
FROM PRODUTO_CATEGORIA
)
SELECT *
FROM RANKED
WHERE POSICAO <= 20
ORDER BY
ID_PERIODO,
CATEGORIA_TICKET,
POSICAO;
---------------------------------
DIM_PERIODO
---------------------------------
SELECT
LEVEL AS ID_PERIODO,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1)) AS MES_REF,
ADD_MONTHS(TRUNC(ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1)),'MM'), -11) AS DATA_INICIO,
LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1))) AS DATA_FIM,
TO_CHAR(
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1)),
'MM/YYYY'
) AS PERIODO_REFERENCIA,
EXTRACT(YEAR FROM ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1))) AS ANO,
EXTRACT(MONTH FROM ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1))) AS MES,
TO_CHAR(
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1)),
'Month',
'NLS_DATE_LANGUAGE=PORTUGUESE'
) AS NOME_MES,
TO_CHAR(
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1)),
'YYYY/MM'
) AS ANO_MES,
CASE
WHEN EXTRACT(MONTH FROM ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1))) BETWEEN 1 AND 3 THEN 'Q1'
WHEN EXTRACT(MONTH FROM ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1))) BETWEEN 4 AND 6 THEN 'Q2'
WHEN EXTRACT(MONTH FROM ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1))) BETWEEN 7 AND 9 THEN 'Q3'
ELSE 'Q4'
END AS TRIMESTRE,
CASE
WHEN EXTRACT(MONTH FROM ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1))) BETWEEN 1 AND 6 THEN '1º Sem'
ELSE '2º Sem'
END AS SEMESTRE
FROM DUAL
CONNECT BY LEVEL <= 12;
-------------------------
Valores_Categ_Fatu
-------------------------
WITH PERIODOS AS (
SELECT
LEVEL AS ID_PERIODO,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1)) AS MES_REF,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL+10)) AS DATA_INICIO,
LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1))) AS DATA_FIM
FROM DUAL
CONNECT BY LEVEL <= 12
),
PARAMETROS AS (
SELECT
MAX(CASE WHEN NOME = 'CON_FREQUENCIACLIENTE'
THEN VALOR END) AS CON_FREQUENCIACLIENTE,
MAX(CASE WHEN NOME = 'CON_FATURAMENTOCATCLIENTE'
THEN VALOR END) AS CON_FATURAMENTOCATCLIENTE
FROM PCPARAMFILIAL
),
FATURAMENTO AS (
SELECT
P.ID_PERIODO,
NF.CODCLI,
SUM(NF.VLATEND) AS FATURAMENTO_BRUTO,
SUM(NF.VLCUSTOFIN) AS CUSTO_BRUTO
FROM VIEW_VENDAS_RESUMO_FATURAMENTO NF
JOIN PERIODOS P
ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
GROUP BY
P.ID_PERIODO,
NF.CODCLI
),
DEVOLUCAO AS (
SELECT
P.ID_PERIODO,
DV.CODCLI,
SUM(DV.VLDEVOLUCAO) AS DEVOLUCAO
FROM VIEW_DEVOL_RESUMO_FATURAMENTO DV
JOIN PERIODOS P
ON DV.DTENT BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE DV.DTCANCEL IS NULL
AND DV.CONDVENDA IN (1,7)
GROUP BY
P.ID_PERIODO,
DV.CODCLI
),
FREQUENCIA AS (
SELECT
P.ID_PERIODO,
NF.CODCLI,
COUNT(DISTINCT NF.NUMTRANSVENDA) AS FREQUENCIA
FROM VIEW_VENDAS_RESUMO_FATURAMENTO NF
JOIN PERIODOS P
ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
GROUP BY
P.ID_PERIODO,
NF.CODCLI
),
BASE_CLIENTE AS (
SELECT
P.ID_PERIODO,
P.MES_REF,
F.CODCLI,
NVL(F.FATURAMENTO_BRUTO,0) AS FATURAMENTO_BRUTO,
NVL(D.DEVOLUCAO,0) AS DEVOLUCAO,
NVL(FR.FREQUENCIA,0) AS FREQUENCIA,
NVL(F.FATURAMENTO_BRUTO,0) - NVL(D.DEVOLUCAO,0) AS FATURAMENTO_LIQUIDO,
NVL(F.CUSTO_BRUTO,0) AS CUSTO_LIQUIDO
FROM PERIODOS P
JOIN FATURAMENTO F ON F.ID_PERIODO = P.ID_PERIODO
LEFT JOIN DEVOLUCAO D
ON D.ID_PERIODO = F.ID_PERIODO
AND D.CODCLI = F.CODCLI
LEFT JOIN FREQUENCIA FR
ON FR.ID_PERIODO = F.ID_PERIODO
AND FR.CODCLI = F.CODCLI
),
CLIENTE_CATEGORIA AS (
SELECT
B.*,
CASE
WHEN FATURAMENTO_LIQUIDO >= CON_FATURAMENTOCATCLIENTE
AND FREQUENCIA >= CON_FREQUENCIACLIENTE
THEN 'DIAMANTE'
WHEN FATURAMENTO_LIQUIDO < CON_FATURAMENTOCATCLIENTE
AND FREQUENCIA >= CON_FREQUENCIACLIENTE
THEN 'PRATA'
WHEN FATURAMENTO_LIQUIDO >= CON_FATURAMENTOCATCLIENTE
AND FREQUENCIA < CON_FREQUENCIACLIENTE
THEN 'OURO'
ELSE 'BRONZE'
END AS CATEGORIA
FROM BASE_CLIENTE B
CROSS JOIN PARAMETROS P
)
SELECT
ID_PERIODO,
TO_CHAR(MES_REF,'MM/YYYY') AS PERIODO_REFERENCIA,
CATEGORIA,
COUNT(DISTINCT CODCLI) AS QTD_CLIENTES,
SUM(FREQUENCIA) AS FREQUENCIA_TOTAL,
SUM(FATURAMENTO_BRUTO) AS FATURAMENTO_BRUTO,
SUM(DEVOLUCAO) AS DEVOLUCAO,
ROUND(SUM(FATURAMENTO_LIQUIDO),2) AS FATURAMENTO_LIQUIDO,
ROUND(
SUM(FATURAMENTO_BRUTO )
/
NULLIF(SUM(FREQUENCIA),0),
2) AS TICKET_MEDIO,
ROUND(
(SUM(FATURAMENTO_LIQUIDO) - SUM(CUSTO_LIQUIDO))
/
NULLIF(SUM(FATURAMENTO_LIQUIDO),0),
4) AS MARGEMa
FROM CLIENTE_CATEGORIA
GROUP BY
ID_PERIODO,
MES_REF,
CATEGORIA
ORDER BY
ID_PERIODO,
CATEGORIA
----------------------------------------------
Valores_Categ_Ticket
----------------------------------------------
WITH PERIODOS AS (
SELECT
LEVEL AS ID_PERIODO,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1)) AS MES_REF,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL+10)) AS DATA_INICIO,
LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1))) AS DATA_FIM
FROM DUAL
CONNECT BY LEVEL <= 12
),
PARAM_CATEGORIA_TICKET AS (
SELECT
500 AS LIM_TICKET_VALOR,
3 AS LIM_TICKET_FREQUENCIA
FROM DUAL
),
FATURAMENTO AS (
SELECT
P.ID_PERIODO,
NF.CODCLI,
SUM(NF.VLATEND) AS FATURAMENTO_BRUTO,
SUM(NF.VLCUSTOFIN) AS CUSTO_BRUTO
FROM VIEW_VENDAS_RESUMO_FATURAMENTO NF
JOIN PERIODOS P
ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
GROUP BY
P.ID_PERIODO,
NF.CODCLI
),
DEVOLUCAO AS (
SELECT
P.ID_PERIODO,
DV.CODCLI,
SUM(DV.VLDEVOLUCAO) AS DEVOLUCAO
FROM VIEW_DEVOL_RESUMO_FATURAMENTO DV
JOIN PERIODOS P
ON DV.DTENT BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE DV.DTCANCEL IS NULL
AND DV.CONDVENDA IN (1,7)
GROUP BY
P.ID_PERIODO,
DV.CODCLI
),
FREQUENCIA AS (
SELECT
P.ID_PERIODO,
NF.CODCLI,
COUNT(DISTINCT NF.NUMTRANSVENDA) AS FREQUENCIA
FROM VIEW_VENDAS_RESUMO_FATURAMENTO NF
JOIN PERIODOS P
ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
GROUP BY
P.ID_PERIODO,
NF.CODCLI
),
BASE_CLIENTE AS (
SELECT
P.ID_PERIODO,
P.MES_REF,
F.CODCLI,
NVL(F.FATURAMENTO_BRUTO,0) AS FATURAMENTO_BRUTO,
NVL(D.DEVOLUCAO,0) AS DEVOLUCAO,
NVL(FR.FREQUENCIA,0) AS FREQUENCIA,
NVL(F.FATURAMENTO_BRUTO,0) - NVL(D.DEVOLUCAO,0) AS FATURAMENTO_LIQUIDO,
NVL(F.CUSTO_BRUTO,0) AS CUSTO_LIQUIDO
FROM PERIODOS P
JOIN FATURAMENTO F ON F.ID_PERIODO = P.ID_PERIODO
LEFT JOIN DEVOLUCAO D
ON D.ID_PERIODO = F.ID_PERIODO
AND D.CODCLI = F.CODCLI
LEFT JOIN FREQUENCIA FR
ON FR.ID_PERIODO = F.ID_PERIODO
AND FR.CODCLI = F.CODCLI
),
CLIENTE_TICKET AS (
SELECT
B.*,
ROUND(
B.FATURAMENTO_LIQUIDO / NULLIF(B.FREQUENCIA,0),
2) AS TICKET_MEDIO_CLI,
CASE
WHEN ROUND(B.FATURAMENTO_LIQUIDO / NULLIF(B.FREQUENCIA,0),2) >= PT.LIM_TICKET_VALOR
AND B.FREQUENCIA >= PT.LIM_TICKET_FREQUENCIA
THEN 'DIAMANTE'
WHEN ROUND(B.FATURAMENTO_LIQUIDO / NULLIF(B.FREQUENCIA,0),2) < PT.LIM_TICKET_VALOR
AND B.FREQUENCIA >= PT.LIM_TICKET_FREQUENCIA
THEN 'PRATA'
WHEN ROUND(B.FATURAMENTO_LIQUIDO / NULLIF(B.FREQUENCIA,0),2) >= PT.LIM_TICKET_VALOR
AND B.FREQUENCIA < PT.LIM_TICKET_FREQUENCIA
THEN 'OURO'
ELSE 'BRONZE'
END AS CATEGORIA_TICKET
FROM BASE_CLIENTE B
CROSS JOIN PARAM_CATEGORIA_TICKET PT
)
SELECT
ID_PERIODO,
TO_CHAR(MES_REF,'MM/YYYY') AS PERIODO_REFERENCIA,
CATEGORIA_TICKET,
COUNT(DISTINCT CODCLI) AS QTD_CLIENTES,
SUM(FREQUENCIA) AS FREQUENCIA_TOTAL,
ROUND(SUM(FATURAMENTO_BRUTO),2) AS FATURAMENTO_BRUTO,
ROUND(SUM(DEVOLUCAO),2) AS DEVOLUCAO,
ROUND(SUM(FATURAMENTO_LIQUIDO),2) AS FATURAMENTO_LIQUIDO,
ROUND(
SUM(FATURAMENTO_BRUTO)
/
NULLIF(SUM(FREQUENCIA),0),
2) AS TICKET_MEDIO,
ROUND(
(SUM(FATURAMENTO_LIQUIDO) - SUM(CUSTO_LIQUIDO))
/
NULLIF(SUM(FATURAMENTO_LIQUIDO),0),
4) AS MARGEM
FROM CLIENTE_TICKET
GROUP BY
ID_PERIODO,
MES_REF,
CATEGORIA_TICKET
ORDER BY
ID_PERIODO,
CATEGORIA_TICKET;
--------------------------
Valores_Periodo
--------------------------
WITH PERIODOS AS (
SELECT
LEVEL AS ID_PERIODO,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1)) AS MES_REF,
ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL+10)) AS DATA_INICIO,
LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'MM'), -(LEVEL-1))) AS DATA_FIM
FROM DUAL
CONNECT BY LEVEL <= 12
),
FATURAMENTO AS (
SELECT
P.ID_PERIODO,
NF.CODCLI,
SUM(NF.VLATEND) AS FATURAMENTO_BRUTO,
SUM(NF.VLCUSTOFIN) AS CUSTO_BRUTO
FROM VIEW_VENDAS_RESUMO_FATURAMENTO NF
JOIN PERIODOS P
ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
GROUP BY
P.ID_PERIODO,
NF.CODCLI
),
DEVOLUCAO AS (
SELECT
P.ID_PERIODO,
DV.CODCLI,
SUM(DV.VLDEVOLUCAO) AS DEVOLUCAO
FROM VIEW_DEVOL_RESUMO_FATURAMENTO DV
JOIN PERIODOS P
ON DV.DTENT BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE DV.DTCANCEL IS NULL
AND DV.CONDVENDA IN (1,7)
GROUP BY
P.ID_PERIODO,
DV.CODCLI
),
FREQUENCIA AS (
SELECT
P.ID_PERIODO,
NF.CODCLI,
COUNT(DISTINCT NF.NUMTRANSVENDA) AS FREQUENCIA
FROM VIEW_VENDAS_RESUMO_FATURAMENTO NF
JOIN PERIODOS P
ON NF.DTSAIDA BETWEEN P.DATA_INICIO AND P.DATA_FIM
WHERE NF.CONDVENDA IN (1,7)
AND NF.DTCANCEL IS NULL
GROUP BY
P.ID_PERIODO,
NF.CODCLI
),
BASE AS (
SELECT
P.ID_PERIODO,
P.MES_REF,
F.CODCLI,
NVL(F.FATURAMENTO_BRUTO,0) AS FATURAMENTO_BRUTO,
NVL(F.CUSTO_BRUTO,0) AS CUSTO_BRUTO,
NVL(D.DEVOLUCAO,0) AS DEVOLUCAO,
NVL(FR.FREQUENCIA,0) AS FREQUENCIA
FROM PERIODOS P
JOIN FATURAMENTO F ON F.ID_PERIODO = P.ID_PERIODO
LEFT JOIN DEVOLUCAO D
ON D.ID_PERIODO = F.ID_PERIODO
AND D.CODCLI = F.CODCLI
LEFT JOIN FREQUENCIA FR
ON FR.ID_PERIODO = F.ID_PERIODO
AND FR.CODCLI = F.CODCLI
)
SELECT
ID_PERIODO,
TO_CHAR(MES_REF,'MM/YYYY') AS PERIODO_REFERENCIA,
COUNT(DISTINCT CODCLI) AS QTD_CLIENTES,
SUM(FREQUENCIA) AS FREQUENCIA_TOTAL,
ROUND(SUM(FATURAMENTO_BRUTO),2) AS FATURAMENTO_BRUTO,
ROUND(SUM(DEVOLUCAO),2) AS DEVOLUCAO,
ROUND(SUM(FATURAMENTO_BRUTO - DEVOLUCAO),2) AS FATURAMENTO_LIQUIDO,
ROUND(SUM(CUSTO_BRUTO),2) AS CUSTO_BRUTO,
ROUND(
(SUM(FATURAMENTO_BRUTO - DEVOLUCAO) - SUM(CUSTO_BRUTO))
/
NULLIF(SUM(FATURAMENTO_BRUTO - DEVOLUCAO),0),
4) AS MARGEM,
ROUND(
SUM(FATURAMENTO_BRUTO)
/
NULLIF(SUM(FREQUENCIA), 0),
2) AS TICKET_MEDIO
FROM BASE
GROUP BY
ID_PERIODO,
MES_REF
ORDER BY
ID_PERIODO