Jump to content
luizfabianochaves

COMPRATIVO ENTRE TABELAS ORACLE

Recommended Posts

buenas pessoal..

 

estou com um problema em um comparativo entre duas tabelas.. uma tabela eu tenho o o resultado das metas e do mix de produtos vendidos na empresa.. calça, camisa, casacos.. etc..

na outra tabela esta o resultado da venda desses produtos.. preciso de um comparativo que me dê o resultado do que foi vendido.. mas o que não foi vendido liste tambem.. quando comparo a coluna MIX_PRODUTO como igual ela traz o resultado da venda correta mas só o que o representante vendeu.. como está na imagem..

quando comparo como diferente ele traz todo o mix.. mas ele lista a soma da venda para todo o mix no caso ali embaixo 110 peças e diminui a quantidade vendida... 

o que preciso é que fique como na segunda imagem.. listando todo o mix, mas aparecendo somente a venda que tem na imagem 1... me fiz entender?

SELECT 
A.CD_MARCA, A.DS_MARCA, A.CD_REPRESENTANTE, A.NM_REPRESENTANTE ,A.DS_MUNICIPIO ,A.DS_SIGLA_EST ,A.CD_CLIENTE ,A.NM_CLIENTE,D.MIX_PRODUTO
,SUM(A.QT_SALDO) as QT_REAL

FROM IM_DEMANDA A
INNER JOIN IM_PERFORMANCE_MIX D ON (D.CD_PERIODO = A.CD_PERIODO) AND (D.CD_MARCA = A.CD_MARCA) AND (D.CD_REPRESENTANTE = A.CD_REPRESENTANTE)

AND (D.MIX_PRODUTO = A.MIX_PRODUTO)

WHERE
A.CD_CLIENTE = '379'
AND A.CD_MARCA = '3'
AND A.CD_PERIODO = '8'

GROUP BY
A.CD_MARCA, A.DS_MARCA, A.CD_REPRESENTANTE, A.NM_REPRESENTANTE, A.DS_MUNICIPIO, A.DS_SIGLA_EST
,A.CD_CLIENTE
,A.NM_CLIENTE
,D.MIX_PRODUTO

2.png.037b6b1810a581aeeeeb3da98cb2b97c.png

SELECT 
A.CD_MARCA, A.DS_MARCA, A.CD_REPRESENTANTE, A.NM_REPRESENTANTE ,A.DS_MUNICIPIO ,A.DS_SIGLA_EST ,A.CD_CLIENTE ,A.NM_CLIENTE,D.MIX_PRODUTO
,SUM(A.QT_SALDO) as QT_REAL

FROM IM_DEMANDA A
INNER JOIN IM_PERFORMANCE_MIX D ON (D.CD_PERIODO = A.CD_PERIODO) AND (D.CD_MARCA = A.CD_MARCA) AND (D.CD_REPRESENTANTE = A.CD_REPRESENTANTE)

AND (D.MIX_PRODUTO <> A.MIX_PRODUTO)

WHERE
A.CD_CLIENTE = '379'
AND A.CD_MARCA = '3'
AND A.CD_PERIODO = '8'

GROUP BY
A.CD_MARCA, A.DS_MARCA, A.CD_REPRESENTANTE, A.NM_REPRESENTANTE, A.DS_MUNICIPIO, A.DS_SIGLA_EST
,A.CD_CLIENTE
,A.NM_CLIENTE
,D.MIX_PRODUTO

1.png.f0cd90a55d0d57491ba71fef8e0e6ed9.png

 

Share this post


Link to post
Share on other sites

Uma solução nestes casos é forçar um valor zerado (por UNION)  para que os produtos não vendidos sejam comparados, segue exemplo.

Share this post


Link to post
Share on other sites
3 horas atrás, Motta disse:

Uma solução nestes casos é forçar um valor zerado (por UNION)  para que os produtos não vendidos sejam comparados, segue exemplo.

Continua com o resultado de quatro linhas.. mas não sei se fiz da maneira correta..

 


 

SELECT 

A.CD_MARCA
,A.DS_MARCA
,A.CD_REPRESENTANTE
,A.NM_REPRESENTANTE
,A.DS_MUNICIPIO
,A.DS_SIGLA_EST
,A.CD_CLIENTE
,A.NM_CLIENTE
,D.MIX_PRODUTO
--,D.QT_META
,SUM(A.QT_SALDO) AS QT_REAL
--,SUM(A.VL_SALDONEG) AS VL_REAL

FROM IM_DEMANDA A
LEFT JOIN IM_PERFORMANCE_MIX D ON D.CD_PERIODO = A.CD_PERIODO AND D.CD_MARCA = A.CD_MARCA AND D.CD_REPRESENTANTE = A.CD_REPRESENTANTE AND D.MIX_PRODUTO = A.MIX_PRODUTO

WHERE

A.CD_MARCA = '3'
AND A.CD_PERIODO = '8'
AND NOT A.CD_REPRESENTANTE = 90020
AND A.CD_CLIENTE = 379

GROUP BY

A.CD_MARCA
,A.DS_MARCA
,A.CD_REPRESENTANTE
,A.NM_REPRESENTANTE
,A.DS_MUNICIPIO
,A.DS_SIGLA_EST
,A.CD_CLIENTE
,A.NM_CLIENTE
,D.MIX_PRODUTO

UNION ALL

SELECT 

A.CD_MARCA
,A.DS_MARCA
,A.CD_REPRESENTANTE
,A.NM_REPRESENTANTE
,A.DS_MUNICIPIO
,A.DS_SIGLA_EST
,A.CD_CLIENTE
,A.NM_CLIENTE
,D.MIX_PRODUTO
--,D.QT_META
,SUM(A.QT_SALDO) AS QT_REAL
--,SUM(A.VL_SALDONEG) AS VL_REAL

FROM IM_DEMANDA A
LEFT JOIN IM_PERFORMANCE_MIX D ON D.CD_PERIODO = A.CD_PERIODO AND D.CD_MARCA = A.CD_MARCA AND D.CD_REPRESENTANTE = A.CD_REPRESENTANTE AND D.MIX_PRODUTO = A.MIX_PRODUTO

WHERE

A.CD_MARCA = '3'
AND A.CD_PERIODO = '8'
AND NOT A.CD_REPRESENTANTE = 90020
AND D.MIX_PRODUTO = '  '
AND A.MIX_PRODUTO = '  '
AND A.CD_CLIENTE = '379'
--AND B.CD_PERIODO IN ('6', '7','8')

GROUP BY

A.CD_MARCA
,A.DS_MARCA
,A.CD_REPRESENTANTE
,A.NM_REPRESENTANTE
,A.DS_MUNICIPIO
,A.DS_SIGLA_EST
,A.CD_CLIENTE
,A.NM_CLIENTE
,D.MIX_PRODUTO
--,D.QT_META
,D.MIX_PRODUTO
--,A.QT_SALDO

 

Share this post


Link to post
Share on other sites

Você tem de usar o sql das metas e o sql das vendas , você precisa cruzá-las

 

grosso modo

 

--metas

select cod_produto, valor_meta

from  metas 

 

--vendas

select cod_produto,sum(valor0 valor_venda

from vendas

group by cod_produto

 

só que nem todo produto foi vendido , assim se cria uma sql saindo do zero

 

--produtos

select cod_produto ,0 valor_venda

from produto

 

--unindo 

select cod_produto,sum(valor_venda) valor_venda

from

(

select cod_produto,sum(valor0 valor_venda

from vendas

group by cod_produto

union all

select cod_produto ,0 valor_venda

from produto

) group by cod_produto

 

---comparando

select *

from 

(

select cod_produto, valor_meta

from  metas) meta,

(

select cod_produto,sum(valor_venda) valor_venda

from

(

select cod_produto,sum(valor0 valor_venda

from vendas

group by cod_produto

union all

select cod_produto ,0 valor_venda

from produto

) group by cod_produto

) venda

where venda.cod_produto = meta.cod_produto

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By RafaGomes
      Boa tarde, seria possível realizar uma consulta da seguinte forma:
      SELECT * FROM CARGA WHERE (CASE WHEN :VARIAVEL = 2 THEN ('2', '7') WHEN :VARIAVEL = 3 THEN ('3', '9', '10') WHEN :VARIAVEL = 4 THEN '4' WHEN :VARIAVEL = 5 THEN '5' WHEN :VARIAVEL = 6 THEN '6' END) IN AD_DIAENTREGA;  
    • By asacap1000
      Galera estou com uma dúvida, tenho a parte de envio de dados para em Post, com encode json e curl. Já pesquisei em todos os lugares e não encontrei nada pra clarear as idéias.
       
      a parte final é essa do envio (cliente)
      header("Content-Type: ".$mediaType); $headers = array(); $headers[] = "Accept: ".$mediaType; $headers[] = "Accept-Charset: ".$charSet; $headers[] = "Accept-Encoding: ".$mediaType; $headers[] = "Content-Type: ".$mediaType.";charset=".$charSet; $headers[] = "Authorization: Basic ".$AuthorizationHeaderBase64; $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS,"contatos=$contatos"); #campos que serão enviados curl_setopt($ch, CURLOPT_USERPWD, $AuthorizationHeaderBase64); curl_setopt($ch, CURLOPT_HEADER, $headers); curl_setopt($ch, CURLINFO_HTTP_CODE, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);#ativa se for ter retorno do chamada $result = curl_exec($ch); $result2 = json_decode($result,true); curl_close($ch); if($result2 === false) { $err = 'Curl error: ' . curl_error($ch); $result2 = $err; echo "This is text".$err; } var_dump ($result2);  
      Preciso de ajuda para entender como deve ser feito a página que será chamada, no caso lado servidor.
       
      Como pode ver tenho um header configurado e será enviado com chave de autorização agora como isso é feito do lado servidor??
       
      Se alguém puder me ajudar, preciso entregar este webservice sexta feira 18/10. Todos os dados recebidos serão salvos no BD Oracle.
       
       
    • By Erika Fragoso
      Boa tarde 
       
      Estou com problema para fechar a a conexão do UTL_SMTP. 
      Quando executo a procedure mais de uma vez,  apresenta erro:  "too many open connections".
       
      Exemplo:
       
      Se executo esse bloco inteiro ele apresenta o erro a seguir:
       
      EXEC ATUALIZACAO(382002, 73, 356.000, 371.900);
      EXEC ATUALIZACAO(382003, 73, 373.600, 386.900);
      EXEC ATUALIZACAO(382004, 73, 389.600, 399.400);
      EXEC ATUALIZACAO(382005, 73, 117.500, 128.200);
      EXEC ATUALIZACAO(382006, 73, 130.900, 138.800);
      EXEC ATUALIZACAO(382007, 73, 146.600, 157.000);
       
       
      ------------ERRO---------------
      0678. 00000 -  "too many open connections"
      *Cause:    An attempt to open a connection failed because too many
                 are already open by this session. The number of allowed
                 connections varies as some may be in use through other
                 components which share the same pool of allowed connections.
      *Action:   Retry after closing some other connection. The number of
                 connections supported is currently not adjustable.
       
      Agora se executo um por um não da erro. A impressão que tenho é que não esta fechando a conexão do UTL_SMTP.
      Ja tentei utilizar o  UTL_SMTP.QUIT e o   UTL_SMTP.CLOSE_CONNECTION  dentro e fora do loop , mas não funcionou.
       
       
      Alguém tem alguma dica do que pode ser feito ?
       
      Segue a procedure :
       
      --Enviar o E-Mail
        IF bEnviaMail then    --(StrDscMsg is not NULL) THEN
          StrCabMail := 'VERSAO : '||p_Versao ||' DIV: '||p_Division ||crlf||crlf||
                        'ID Anti  Novo ID  KM Ini  KM Fim  Lin  Vel  Tipo  H_Ini  H_Fim Motivo  ';
          StrDscMsg  :=  StrCabMail ||crlf|| StrDscMsg;
          
           connmail   := UTL_SMTP.OPEN_CONNECTION('smtp',25);

            FOR RegEmail IN(
                             SELECT MR_MAIL
                               FROM MAIL_REFRESH
                              WHERE MR_GRUPO = 1
                           ) LOOP
                               
           BEGIN
                       ----connmail   := UTL_SMTP.OPEN_CONNECTION('smtp',25);

                      StrMailMsg := 'Date: '   ||TO_CHAR( SYSDATE,'dd Mon yyyy hh24:mi:ss') ||crlf||
                                    'From:  <' ||'restricao@gmail.com'||'>'               ||crlf||
                                    'Subject: '||'REFRESH VERSAO ' || p_Versao ||
                                               TO_CHAR( SYSDATE,' dd/mm/yyyy hh24:mi:ss')   ||crlf||
                                    'To: '     || ToEmail                                   ||crlf||
                                    ' Atualizações que foram retiradas e recolocadas na base ' ||crlf||
                                    ''                                                      ||crlf||                              
                                    'Banco: ' || db_name || ' - ' || schema_name            ||crlf|| 
                                    ''                                                      ||crlf||
                                    StrDscMsg                                               ||crlf||
                                    ''                                                      ||crlf||
                                    ''                                                      ||crlf||
                                    '[ATUALIZACAO]';
                      UTL_SMTP.HELO(connmail,'smtp');
                      UTL_SMTP.MAIL(connmail,'restricao@gmail.com');
                      UTL_SMTP.RCPT(connmail, RegEmail.MR_MAIL);
                      UTL_SMTP.DATA(connmail,StrMailMsg);
                     -- UTL_SMTP.QUIT(connmail);
            END;
             
            End Loop;
                    UTL_SMTP.QUIT(connmail);  
        End If;
        COMMIT;
            
      END;
       
       
    • By asacap1000
      Galera salve a todos.
       
      Gostaria de saber se é possivel e se for como fazer.  Tenho um select de faturamento, e nesta consulta ele me traz o numero da NF, ele me traz os ítens faturados. Gostaria de saber se´no próprio select é possível trazer o numero da NF apenas uma vez, e nas outras linhas que estarão vindo os ítens cobrados estes campos ficarem vazios.
       
      Segue exemplo hoje como está e como eu preciso.
       

       
      Como eu preciso:
       

       
       
      Abaixo o select
       
      SELECT A.ID_KLIENT COD, K.NAME NOME, A.BILLITE ITEM, I.DESCRIPTION DESC_ITEM, SUM(A.MNG) QUANT, SUM(ROUND(A.PREIS, 3)) VALOR, BO.NR_NF NF FROM BILL_OS_ITEM A, BILL_ITEM I, KLIENTEN K, BILL_OS BO, (SELECT T.DOCSVE_REF, D.DOCHD_DOC_ID FROM FISCAL.DOCSVE T, FISCAL.DOCHD D WHERE T.DOCSVE_DOC_PRC_ID = D.DOCHD_DOC_PRC_ID) REFE WHERE I.BILLITE = A.BILLITE AND A.ID_KLIENT = K.ID_KLIENT AND BO.NR_NF = REFE.DOCHD_DOC_ID(+) AND BO.ID_KLIENT = K.ID_KLIENT AND BO.STATUS <> '80' AND BO.ID_OS = A.ID_OS AND TRUNC(BO.DATE_EMISS) >= TO_DATE('01/09/2019', 'DD/MM/YYYY') AND TRUNC(BO.DATE_EMISS) <= TO_DATE('30/09/2019', 'DD/MM/YYYY') GROUP BY A.ID_KLIENT, K.NAME, A.BILLITE, I.DESCRIPTION, BO.NR_NF, BO.LOTE, REFE.DOCSVE_REF ORDER BY K.NAME, A.ID_KLIENT, A.BILLITE  
    • By jhapa
      Bom dia galera,
      É o seguinte, possuo um banco de dados Oracle 10g instalado em um Oracle Linux.
      Hoje em dia faço backup apenas com Expdp, nunca usei Rman por falta de experiência e porque quando entrei a rotina de backup já existia.
      Sou leigo em questão Rman, pesquisei um pouco ultimamente e vi que o banco precisa estar em modo archivelog, coisa que meu banco não está, o tamanho total dos meus dbf gira em torno de 80gb.
      Estou com um pouco de receio de alterar para modo archivelog, pode dar algum problema?
      No modo archivelog há algum problema em casos de desligamento inesperados, é necessário algum comando quando o servidor ligar?
      O que realmente preciso verficar para ativar o archivelog?
      Pretendo efetuar essa mudança para trocar de hardware, já possuo um outro servidor de testes onde regularmente importo o arquivo de backup para testes, a ideia era colocar esse servidor de testes como servidor de produção.
       
       
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.