Jump to content

Recommended Posts

Prezados, boa noite!

 

Me deparei com um problema aqui que acredito que seja bem simples para voces. Estou aqui precisando agrupar dados com a maior data de vendas para um cliente Numa coluna para todas as linhas do cliente (registro a registro das notas). Tambem preciso fazer algumas operacoes de total para disponibilizar um SCRIPT SQL sql para ser consumido por uma ferramenta analitica de BI e foi especificado exatamente como esta na planilha. Para facilitar criei os cenários. Tem os scripts de criacao da tabela e de insert e os resultados esperados nas colunas calculadas pelo sql. Espero que a documentação esteja boa para o caso de uso e que voces possam me ajudar. POde ser didatico para quem da aulas de PL SQL.

 

Grato

 

Att

Paulo

 

PS: como nao aceitou a planilha, escrevo abaixo:

 

--SCRIPT DE CRIACAO TABELA ORACLE
CREATE TABLE T_VENDAS
  (DATA_VENDA DATE,
  COD_CLI NUMBER (10),
  CLIENTE VARCHAR2(10),
  NUM_NF VARCHAR(10),
  ITEM VARCHAR2(20),
  QTDE NUMBER (10,2),
  VL_TOT_ITEM NUMBER (10,2),
  VL_UNIT NUMBER (10,2));
--INSERTS

INSERT INTO T_VENDAS VALUES('05-Jan-2019',15,'JOAO','20','MESA',1,200,200);
INSERT INTO T_VENDAS VALUES('05-Jan-2019',15,'JOAO','20','CADEIRA',4,240,60);
INSERT INTO T_VENDAS VALUES('21-Jan-2019',15,'JOAO','66','BANCO',2,240,120);
INSERT INTO T_VENDAS VALUES('08-Feb-2019',15,'JOAO','102','GELADEIRA',1,600,600);
INSERT INTO T_VENDAS VALUES('07-Mar-2019',15,'JOAO','145','ARMARIO',1,450,450);
INSERT INTO T_VENDAS VALUES('05-Jan-2019',20,'MARIA','28','SOFA',1,750,750);
INSERT INTO T_VENDAS VALUES('05-Jan-2019',20,'MARIA','28','TAPETE',2,280,140);
INSERT INTO T_VENDAS VALUES('21-Jan-2019',20,'MARIA','72','CORTINA',2,160,80);
INSERT INTO T_VENDAS VALUES('08-Feb-2019',20,'MARIA','120','CAMA',1,400,400);
INSERT INTO T_VENDAS VALUES('17-Feb-2019',20,'MARIA','151','COLCHAO',1,500,500);

 

 

CENARIOS (DADOS INSERIDOS NA TABELA T_VENDAS - COLUNAS DO EXCEL ABAIXO: B, C, D, E, F, G, H, I)

 

image.thumb.png.bed0351877b13f2290b0df1ee80a7a1b.png

 

COLUNAS CALCULADAS ESPERADAS NO SCRIPT SQL ALEM DAS COLUNAS JA EXISTENTES NA TABELA

 

image.png.f0d7770b1fba43dcd3cfc7f5a86c7c49.png

 

RESULTADO ESPERADO DO SCRIPT SQL

 

image.thumb.png.659de18f9bab15fa8a4b3d85b64c3a4f.png

 

 

 

   

Share this post


Link to post
Share on other sites

Obrigado Motta, vou olhar! De qualquer modo, se puders ajudar a montar o script te agradeco. Abs

Share this post


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

 Oi Motta, agradeço imensamente as dicas. Fiz o dever de casa e o script funcionou para as colunas que eu queria agrupar valores por cliente, max da data, etc. Falta apenas diminuir as colunas de data....

 

o script ficou assim:

SELECT
    Trunc(DATA_VENDA) AS "DATA VENDA",
    COD_CLI,
    CLIENTE,
    NUM_NF,
    ITEM,
    QTDE,
    VL_TOT_ITEM,
    VL_UNIT,
    Trunc(SYSDATE) AS "DATA_ATUAL",
    Sum(VL_TOT_ITEM) OVER (PARTITION BY COD_CLI) AS "VL_TOT_CLIENTE",
    MAX(Trunc(DATA_VENDA)) OVER (PARTITION BY COD_CLI) AS "DATA ULT COMPRA",
    COUNT(*) AS "QTDE REG"
FROM T_VENDAS
GROUP BY   
  Trunc(DATA_VENDA),
    COD_CLI,
    CLIENTE,
    NUM_NF,
    ITEM,
    QTDE,
    VL_TOT_ITEM,
    VL_UNIT;

 

 

Grato pela ajuda e pelo trabalho aqui nesse forum.

Share this post


Link to post
Share on other sites
Citar

Falta apenas diminuir as colunas de data

 

 

!?

Share this post


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

 

 

!?

script final ficou assim:

SELECT
    TRUNC(DATA_VENDA) AS "DATA VENDA",
    COD_CLI,
    CLIENTE,
    NUM_NF,
    ITEM,
    QTDE,
    VL_TOT_ITEM,
    VL_UNIT,
    TRUNC(SYSDATE) AS "DATA_ATUAL",
    SUM(VL_TOT_ITEM) OVER (PARTITION BY COD_CLI) AS "VL_TOT_CLIENTE",
    MAX(TRUNC(DATA_VENDA)) OVER (PARTITION BY COD_CLI) AS "DATA ULT COMPRA",
    TRUNC(SYSDATE)-TRUNC(DATA_VENDA) AS "DIF DIAS EMISSAO E DATA ATUAL",
    TRUNC(SYSDATE)-MAX(TRUNC(DATA_VENDA)) OVER (PARTITION BY COD_CLI) AS "DIAS SEM COMPRA",
    COUNT(*) AS "QTDE REG"
FROM T_VENDAS
GROUP BY   
    TRUNC(DATA_VENDA),
    COD_CLI,
    CLIENTE,
    NUM_NF,
    ITEM,
    QTDE,
    VL_TOT_ITEM,
    VL_UNIT;

 

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 Dinho Nunes LC
      <div align="center" id="subtitulo"> Canais Abertos </div> <div class="ui cards"> <div class="card"> <div class="content"> <a href="globo.html" style="display: block; color: black"> <div align="center"> <div> <img class="ui tiny image" id="imagem_card_casa" src="assets/images/Rede_Globo_2014.png"> <div align="center" id = "nome_time_fora"> <b>Globo RJ</b> </div> </div> Onde "globo.html" seria substituído pelo link que esta em uma tabela do banco de dados.
       
      Já fiz a conexão. E tenho a base de dados pronta.
       
      Motivo pelo qual estou buscando ajuda:
       
      Faço manualmente a mudança de cada link (são mais de 300) diariamente para evitar copias de terceiros. Sendo assim poderia usar um CRUD para facilitar a troca dos links direto no banco de dados.
    • By jeanzinsousa
      Salve, Galera estou com uma dúvida estudando banco de dados e programação.
       
      escrevi a seguinte query:
       
      SELECT data_pg as diaria, SUM(valor_pg) as valor_diario, SUM(valor_despesa) as valor_despesa, (SELECT SUM(valor_pg) as dinheiro FROM pagamento WHERE tipo = 5 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) as total_dinheiro, (SELECTSUM(valor_pg) as debito FROM pagamento WHERE tipo = 25 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) as total_debito, (SELECT SUM(valor_pg) as credito FROM pagamento WHERE tipo = 15 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) astotal_credito FROM pagamento WHERE MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019 GROUP BY diaria ORDER BY `diaria`
       
      resultado:
      diaria  1 valor_diario valor_despesa total_dinheiro total_debito total_credito   2019-06-10 818.70 0 288.40 586.95 113.30 2019-06-11 169.95 0 288.40 586.95 113.30
       
       
       
       
      Como podem ver meu objetivo e separar por dia o resultado dos valores divididos por tipo de pagamento.
      porém o mesmo mostra a soma total nas subquery.
      quando coloco o group by order by dentro das subquerys apresenta a seguinte mensagem de erro: #1242 - Subquery returns more than 1 row 
       
       
      como resolver?
    • By JorgeeHenrique
      Bom dia, sou iniciante em Delphi, estou fazendo um Cadastro de Clientes, gostaria de usar três Edit´s para filtrar alguns  dados porem com o código abaixo consegui fazer apenas com 1 edit.text, como faço pra usar três e que se algum estiver em branco ele retorna o valor apenas do Edit.text que foi preenchido?
       
      Exemplo: 
       
      Quero buscar por Nome, Situação e Rota (Cliente a da rota B com situação C) e se algum desses campos estiver vazio ele busca apenas o que foi preenchido. Obrigado pela atenção!
       
      .
      procedure TFrm_Cadastro.Bt_BuscarClick(Sender: TObject); begin with Frm_Cadastro.Tbl_Clientes do begin Close; SQL.Clear; SQL.Add( 'Select * from Tbl_Cad_Clientes'); SQL.Add('where Cli_Nome like :nome'); ParamByName('nome').Value := '%' + txt_buscar_nome.Text + '%'; Open; end; end;  
    • By lemanoel
      Oi, alguem pode me ajudar?
       
      Tenho uma tabela de status por dia, e efetivo um registro só quando ha alterações.. exemplo:
      Dia 01, bom
      Dia 03, médio
      Dia 10, ruim
       
      Como encontrar o status do dia 07, via sql?
      Olhando pro exemplo sei que seria MÉDIO… mas nao tenho a menor ideia de como escrever o código....
    • By Viniciusr9
      Estou com um problema com esse esse script abaixo: 
      tenho um checkbox na minha página ( não em relatório, na página mesmo, um item de página) e gostaria que o mesmo ao ser clicado e pressionado um botão submit realizasse o procedimento do script, porém ele faz o processo mas não me retorna nada. acredito que o problema seja no LOOP do APEX_APPLICATION.G_F01 . Alguém consegue me ajudar com isso?
      DECLARE V_DS_COLAB VARCHAR2(50); BEGIN APEX_DEBUG.MESSAGE('CHECK:'|| vCHECK); FOR A IN 1 .. APEX_APPLICATION.G_F01.COUNT LOOP BEGIN SELECT C.DS_COLABORADOR INTO V_DS_COLAB FROM COLABORADOR C WHERE C.USER_APEX = V('APP_USER') ; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20001,'NENHUM REGISTRO ENCONTRADO!'); WHEN TOO_MANY_ROWS THEN RAISE_APPLICATION_ERROR(-20002,'MAIS QUE UM REGISTRO ENCONTRADO!'); WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20003,'ERRO NAO PREVISTO' || SQLERRM) ; END; :P12_SUPER := (V_DS_COLAB || ' - ' || TO_CHAR(SYSDATE,'DD/MM/RRRR HH24:MI')); UPDATE COMPETENCIA_COLABORADOR CC SET FINALIZADO_SN = 'S' WHERE CC.CD_EQUIPE = :P12_EQUIPE AND CC.CD_COMPETENCIA = (SELECT C.CD_COMPETENCIA FROM COMPETENCIA C WHERE TO_DATE(LPAD(C.MES_COMPETENCIA,2,'0') || '/' || C.ANO_COMPETENCIA,'MM/RRRR') = TO_DATE(:P12_COMPETENCIA,'MM/RRRR')); END LOOP; END;  
×

Important Information

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