Array
(
)

Ajuda no Scrip para otimiza-lo.

Alex Lekao
   - 30 jun 2011

Ola Boa noite!!!

Montei este script a para trazer em qual loja o cliente fez a ultima compra, como nao tinha muita ideia do que fazer e alguns scripts que montei estavam ficando inviaveis a utilizacao, devido a demora, entao resolvi fazer os unions gostaria de uma ajuda na analise do mesmo para fazer se performaticamente esta bom ou se poderia melhorar ainda mais.   Parti do principio da eliminacao, por exemplo, verificando quais eram os clientes que nao compraram naquela loja e qual a data da compra, nao sei se estaou sendo claro, mas o que preciso eh saber onde o cliente comprou por ultimo e em qual das 4 lojas e quando foi feita esta compra.   o cadastro de clientes eh unico e as lojas tem banco de movimentacao de dados separados.   agradeco a forca.   abraco.   Alex - Lekao.   SELECT
   CASE WHEN C.CODLOJ='001' THEN '001 - LAPA'
        WHEN C.CODLOJ='002' THEN '002 - FREG'
        WHEN C.CODLOJ='003' THEN '003 - PINH'
   ELSE '004 - JUND'
   END AS LOJA,
   C.CODCLI+' - '+C.NOME  AS CLIENTE,
   CASE WHEN R.CODLOJ='001' THEN '001 - LAPA'
        WHEN R.CODLOJ='002' THEN '002 - FREG'
        WHEN R.CODLOJ='003' THEN '003 - PINH'
   ELSE '004 - JUND'
   END  AS LOJAVDA,
   C.TABVDA AS TABVDA,
   MAX(R.DATEMI) AS DTVDA
FROM LOJA1.DBO.REQVDA AS R
LEFT JOIN LOJA1.DBO.CLIENTES AS C ON (C.CODCLI = R.CODCLI)
WHERE EXISTS (SELECT CODCLI FROM LOJA1.DBO.CLIENTES)
   AND R.TIPOREQ = 'VD'
   AND R.CODCPV <> '80'
   AND R.CODLOJ <> C.CODLOJ
GROUP BY C.CODLOJ,C.CODCLI,C.NOME,R.CODLOJ,C.TABVDA
UNION
SELECT
   CASE WHEN C.CODLOJ='001' THEN '001 - LAPA'
        WHEN C.CODLOJ='002' THEN '002 - FREG'
        WHEN C.CODLOJ='003' THEN '003 - PINH'
   ELSE '004 - JUND'
   END AS LOJA,
   C.CODCLI+' - '+C.NOME  AS CLIENTE,
   CASE WHEN R.CODLOJ='001' THEN '001 - LAPA'
        WHEN R.CODLOJ='002' THEN '002 - FREG'
        WHEN R.CODLOJ='003' THEN '003 - PINH'
   ELSE '004 - JUND'
   END  AS LOJAVDA,
   C.TABVDA AS TABVDA,
   MAX(R.DATEMI) AS DTVDA
FROM LOJA2.DBO.REQVDA AS R
LEFT JOIN LOJA1.DBO.CLIENTES AS C ON (C.CODCLI = R.CODCLI)
WHERE EXISTS (SELECT CODCLI FROM LOJA1.DBO.CLIENTES)
   AND R.TIPOREQ = 'VD'
   AND R.CODCPV <> '80'
   AND R.CODLOJ <> C.CODLOJ
GROUP BY C.CODLOJ,C.CODCLI,C.NOME,R.CODLOJ,C.TABVDA
UNION
SELECT
   CASE WHEN C.CODLOJ='001' THEN '001 - LAPA'
        WHEN C.CODLOJ='002' THEN '002 - FREG'
        WHEN C.CODLOJ='003' THEN '003 - PINH'
   ELSE '004 - JUND'
   END AS LOJA,
   C.CODCLI+' - '+C.NOME  AS CLIENTE,
   CASE WHEN R.CODLOJ='001' THEN '001 - LAPA'
        WHEN R.CODLOJ='002' THEN '002 - FREG'
        WHEN R.CODLOJ='003' THEN '003 - PINH'
   ELSE '004 - JUND'
   END  AS LOJAVDA,
   C.TABVDA AS TABVDA,
   MAX(R.DATEMI) AS DTVDA
FROM LOJA4.DBO.REQVDA AS R
LEFT JOIN LOJA1.DBO.CLIENTES AS C ON (C.CODCLI = R.CODCLI)
WHERE EXISTS (SELECT CODCLI FROM LOJA1.DBO.CLIENTES)
   AND R.TIPOREQ = 'VD'
   AND R.CODCPV <> '80'
   AND R.CODLOJ <> C.CODLOJ
GROUP BY C.CODLOJ,C.CODCLI,C.NOME,R.CODLOJ,C.TABVDA
UNION
SELECT
   CASE WHEN C.CODLOJ='001' THEN '001 - LAPA'
        WHEN C.CODLOJ='002' THEN '002 - FREG'
        WHEN C.CODLOJ='003' THEN '003 - PINH'
   ELSE '004 - JUND'
   END AS LOJA,
   C.CODCLI+' - '+C.NOME  AS CLIENTE,
   CASE WHEN R.CODLOJ='001' THEN '001 - LAPA'
        WHEN R.CODLOJ='002' THEN '002 - FREG'
        WHEN R.CODLOJ='003' THEN '003 - PINH'
   ELSE '004 - JUND'
   END  AS LOJAVDA,
   C.TABVDA AS TABVDA,
   MAX(R.DATEMI) AS DTVDA
FROM JACSYSDB4.DBO.REQVDA AS R
LEFT JOIN LOJA1.DBO.CLIENTES AS C ON (C.CODCLI = R.CODCLI)
WHERE EXISTS (SELECT CODCLI FROM LOJA1.DBO.CLIENTES)
   AND R.TIPOREQ = 'VD'
   AND R.CODCPV <> '80'
   AND R.CODLOJ <> C.CODLOJ
GROUP BY C.CODLOJ,C.CODCLI,C.NOME,R.CODLOJ,C.TABVDA

Emerson
   - 01 jul 2011

essa instrução está correta? a linha AND R.CODLOJ <> C.CODLOJ deve realmente existir???

porque no meu entendimento essa linha trará um resultado errado.
imagine que minha última compra foi na LOJA1. eu sou cliente da LOJA1. lendo seu script, ele não trará os dados corretamente, pois a parte que avalia a LOJA1:

SELECT
   CASE WHEN C.CODLOJ='001' THEN '001 - LAPA'
        WHEN C.CODLOJ='002' THEN '002 - FREG'
        WHEN C.CODLOJ='003' THEN '003 - PINH'
   ELSE '004 - JUND'
   END AS LOJA,
   C.CODCLI+' - '+C.NOME  AS CLIENTE,
   CASE WHEN R.CODLOJ='001' THEN '001 - LAPA'
        WHEN R.CODLOJ='002' THEN '002 - FREG'
        WHEN R.CODLOJ='003' THEN '003 - PINH'
   ELSE '004 - JUND'
   END  AS LOJAVDA,
   C.TABVDA AS TABVDA,
   MAX(R.DATEMI) AS DTVDA
FROM LOJA1.DBO.REQVDA AS R
LEFT JOIN LOJA1.DBO.CLIENTES AS C ON (C.CODCLI = R.CODCLI)
WHERE EXISTS (SELECT CODCLI FROM LOJA1.DBO.CLIENTES)
   AND R.TIPOREQ = 'VD'
   AND R.CODCPV <> '80'
   AND R.CODLOJ <> C.CODLOJ
GROUP BY C.CODLOJ,C.CODCLI,C.NOME,R.CODLOJ,C.TABVDA

diz para trazer somente os clientes que não são da LOJA1, correto?

como os dados da venda para esse cliente da LOJA1, QUE EU SEI QUE COMPROU POR ÚLTIMO NA LOJA1, apareceriam?

creio que a linha AND R.CODLOJ <> C.CODLOJ esteja totalmente equivocada. analise com cautela (pois eu posso estar falando bobagem).

Alex Lekao
   - 01 jul 2011

Ola Emerson, bom dia!!!   Muito obrigado pela colaboracao!!!   Acho que nao mencionei, a intencao eh encontrar os clientes que estao comprando nas lojas que nao sao cadastrados tambem.   Por exemplo, o cliente eh um cliente cadastrado para comprar na Loja1, e por algum motivo ele vem comprando na Loja 3, por exemplo, eu quero listar esse cliente.   Aqui nos temos uma diferenca entre precos das lojas, por exemplo em lojas fora da Cidade onde fica a Matriz, o preco eh diferenciado devido o frete para entrega, essas coisas.   Nessa caso se o cliente eh da Loja 1 e comprou na Loja 1, as compras dele estaria dentro da normalidade.   Mas obrigado mesmo pela observacao, porque com isso eu posso remover essa linha e ter realmente o Local onde o cliente comprou por ultimo, assim teria um relatorio a mais com finalidade diferenciada.   Obrigado.   Abraco.   Alex - Lekao