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 johnklo
      COM BASE NA TABELA HR DO ORACLE
      Preciso criar uma sub-rotina (procedure) que imprima na tela o número de funcionários (employees) agrupados por departamentos (department_id). Deve-se ordenar a saída em ordem decrescente pela quantidade de departamentos. Pode-se utilizar qualquer forma de cursor para imprimir o resultado.
    • By EREGON
      Olá,
      ao chamar a função, estou a receber o erro:
       
      "ORA-01422: extracção exacta devolve mais que o número pedido de linhas"
       
      create or replace FUNCTION "CALC_ADDT_SIM_DISC" (ACCT_INPUT VARCHAR2) RETURN VARCHAR2 IS SIM_MSISDN VARCHAR2(20); BEGIN SELECT CASE WHEN ADDT_DISC_1 = 1 THEN mu.MSISDN WHEN ADDT_DISC_1 > 1 THEN (SELECT DISTINCT t02.MSISDN FROM CDM.DMKV_TRANSP_VAR_RESULT_02 t02 WHERE SERV_ACCT_OLDER_MSISDN_FLG = 'Y' AND PRICING_PLAN_TYPE IN ('valor1', 'valor2') AND t02.DW_SERV_ST_ID='100000003' AND t02.CUST_ACCT_EXT_KEY = ACCT_INPUT ) END MSISDN_ADDT_DISC INTO SIM_MSISDN FROM( SELECT DISTINCT CUST_ACCT_EXT_KEY, COUNT(CUST_ACCT_EXT_KEY) AS ADDT_DISC_1 FROM MOBILE_UPSELL WHERE FLAG_ADDITIONAL_SIM_DISCOUNT = '0' GROUP BY CUST_ACCT_EXT_KEY )t, MOBILE_UPSELL mu WHERE t.CUST_ACCT_EXT_KEY = mu.CUST_ACCT_EXT_KEY AND t.CUST_ACCT_EXT_KEY = ACCT_INPUT; RETURN SIM_MSISDN; END; O que estou a fazer de errado?
       
      Obrigado
    • By Querendo_ser_Nerd
      Bom dia , 
       
      Pessoal, realizei diversas pesquisas em Fórum e Artigos, meu caso seria, criei uma aplicação na qual realiza a importação de arquivo em XLS em um DataGridView , está carregando a informação a principio em uma coluna (Duvida as colunas no Excel algumas contem sinais e espaço como "Cód. Cliente" como faço select * from [plan1$] para retornar apenas pela posição da coluna ex. select [A1] from [plan1$] ) , certo , carreguei no DataGrid, creei um botão para carregar as informações do data grid para o BD Oracle, passei toda a configuração conexão e realizei o INSERT , mas não popula com as informações do grid na tabela, apenas quando no INSERT ...Values (1) por exemplo o mesmo inseri o valor na tabela no banco. Já realizei a depuração mas não consigo. Sou novo nessa linguagem. Obg pela Ajuda.
       
      using System; using System.Data; using System.Data.OleDb; // intregração Excel using System.Data.OracleClient; using System.Windows.Forms; namespace WindowsFormsLog {     public partial class Form4 : Form     {                  public Form4()         {             InitializeComponent();         }         private void button1_Click(object sender, EventArgs e)         {             OpenFileDialog openFileDialog = new OpenFileDialog();             if(openFileDialog.ShowDialog()== System.Windows.Forms.DialogResult.OK)             {                 this.textBox1.Text = openFileDialog.FileName;             }         }                 private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)         {                     }         public void button2_Click_1(object sender, EventArgs e)         {              string PathCpnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + textBox1.Text + ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1';";             OleDbConnection conn = new OleDbConnection(PathCpnn);             //LINQ c#              OleDbDataAdapter myDbDataAdapter = new OleDbDataAdapter("Select *  from [Plan1$]", conn); // planilha deve conter o nome Plan1             DataTable dt = new DataTable(); // armazena dado               myDbDataAdapter.Fill(dt);               dataGridView1.DataSource = dt;             dataGridView1.Columns[0].HeaderText = "NROPEDCLIENTE"; //alterando nome das colunas             //  dataGridView1.Columns[1].HeaderText = "DTAINCLUSAO";                  }             private void Form4_Load(object sender, EventArgs e)         {         }         public void button3_Click(object sender, EventArgs e)         {             string OracleConn = @"Data Source = ok; User ID =ok ; Password = ok; Unicode = True";             OracleConnection conexao = new OracleConnection(OracleConn);                          try             {                                if (dataGridView1.Rows.Count > 1)                 {                     for (int i = 1; i <= dataGridView1.Rows.Count ; i++)//-1                     {                         int dataGridView1 = Convert.ToInt32(this.dataGridView1.Rows[i].Cells[0].Value);                         conexao.Open();                         OracleCommand comando = new OracleCommand ("insert into pedido values(@NROPEDCLIENTE)", conexao);                           comando.Parameters.AddWithValue("NROPEDCLIENTE", dataGridView1);                                             comando.ExecuteNonQuery();                         MessageBox.Show("Insert");                         conexao.Close();                     }                 }             }             catch (Exception)             {                 MessageBox.Show("Erro ao inserir"); // Sempre finaliza aqui depuração             }                      }                }     }
          
    • By Zarreftv
      PESSOAL, NÃO TENHO CONHECIMENTO EM PHP, E PEÇO DE CORAÇÃO A AJUDA DE VOCÊS.
       
      PRECISO DE UM SCRIPT, ONDE, EU TENHA TENHA UMA "TABELA" COM NÚMEROS DIVERSOS (NO CASO IREMOS USAR NÚMEROS DE CODIGOS CADASTRO),
       
      ESTA "TABELA" PODE SER ALTERADA(PORÉM COM HTML, OU O QUE FOR MAIS FÁCIL).
       
      E ASSIM TERÁ UM TEXT BOX, ONDE O USUARIO VAI INSERIR O SEU CÓDIGO, 
       
      EXEMPLO SOU O CÓDIGO 0001 , EU IREI INSERIR O CÓDIGO 0001, CASO O MEU CÓDIGO ESTEJA NA TABELA, ABAIXO DESTE TEXT BOX IRÁ APARECER A MSG:

      VOCÊ ESTÁ APTO.

      CASO O CODIGO 0001 NÃO ESTEJA NA TABELA, ABAIXO DO TEXT BOX IRÁ APARECER, VOCÊ NÃO ESTÁ APTO.
       
      ALGUEM PODERIA ME AJUDAR?
       
      POR FAVOR.
       
      QUALQUER DÚVIDA EU EXPLICO MELHOR!
    • By Willian Simione
      Boa tarde a Todos...Estou com um problema que é o seguinte, preciso mostrar um relatório de controle de estoque que me da todos os produtos sem repetir tenho isso cadastrado
       
      Produto A - 10 - 12,00
      Produto B - 5 - 13,00
      Produto C- 5 - 15,00
      Produto A - 12 - 35,00
      Produto A - 23 - 55,00
      Produto C - 30 - 150,00
      Produto B - 5 - 13,00
       
       
      Preciso Mostrar isso no controle de estoque
      Produto A - QTD TOTAL - VALOR TOTAL
      Produto B - QTD TOTAL - VALOR TOTAL
      Produto C - QTD TOTAL - VALOR TOTAL
       
      Meu código é PDO
       
      Obrigado
       
       
       
       
       
×

Important Information

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