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 rafaelmoreira78
      Boa tarde!
      Estou querendo fazer um select a partir da seleção de um combobox. Nesse combobox o usuário escolhe o tipo de busca que ele quer. Se é por nome, por id, por data etc. E depois, exibe os dados nos campos. Porém, não estou conseguindo e não sei como resolver isso.
      public void consultar(){ String sql ="select * from tbcertificados where ?=?"; try{ pst=conexao.prepareStatement(sql); pst.setString(1,cbConsulta.getSelectedItem().toString()); pst.setString(2,txtBusca.getText()); rs=pst.executeQuery(); if (rs.next()){ lblID.setText(rs.getString(1)); txtNome.setText(rs.getString(2)); comboCursos.setSelectedItem(rs.getString(3)); txtData.setText(rs.getString(4)); txtCH.setText(rs.getString(5)); txtEmpresa.setText(rs.getString(6)); txtObs.setText(rs.getString(7)); }  
    • By asacap1000
      Galera me foi solicitado a criação de um servidor web, para disponibilizar serviços para os clientes. O que vocês recomendam?
      Tenho um servidor da DELL com windows 2016. Todo o desenvolvimento será em PHP, Javascript e companhia Ltda com conexão aos bancos de dados Mysql, SQL e ORACLE.
      Já temos um servidor que será desativado porém está utilizando uma versão muito antiga de PHP 5.4 e como base de instalação foi utilizado o WampServer. 
    • By Motta
      Envio de https via Oracle Versão
      Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production PL/SQL Release 12.2.0.1.0 - Production "CORE 12.2.0.1.0 Production" TNS for Linux: Version 12.2.0.1.0 - Production NLSRTL Version 12.2.0.1.0 - Production Obs 1) Wallet Instalado
      Obs 2) O problema não seria reproduzível por questões de segurança Obs 3) Já tentei com o fornecedor
      Tento enviar um POST via PLSQL e recebo o seguinte erro : Erro : ORA-24263: Certificate of the remote server does not match the target address.
      Pergunta Como posso saber o valor de req := utl_http.begin_request(url, 'POST',https_host =>'???????'); ? é obrigatório ?
      create or replace PROCEDURE "SMS_ENVIO2" (PNUMSMS IN VARCHAR2 , PTEXTO IN VARCHAR2 , PRETORNO OUT VARCHAR2) /*alguns dados ocultos*/ AS req utl_http.req; res utl_http.resp; url varchar2(4000) := 'https://messaging.o2c.cloud/api/v2/sms/';--acho que posso citar o site name varchar2(4000); buffer varchar2(4000); content varchar2(4000); VS_USUARIO VARCHAR2(11) := '*****'; VS_SENHA VARCHAR2(20) := '*****'; VS_SERIAL VARCHAR2(8);--VARCHAR2(100); VS_SCHEDULLE VARCHAR2(16) := TO_CHAR(SYSDATE,'DD/MM/YYYY HH24:MI'); VS_AUTHOR_64 VARCHAR2(20) := '*********'; begin UTL_HTTP.SET_WALLET('file:.....', '**********'); -- VS_SERIAL := LPAD(SMSENVIO_SERIAL_SEQ.NEXTVAL,8,'0'); content := ' { ' || ' "sendSmsRequest": {' || ' "to": "' || PNUMSMS ||'",' || ' "message": "' || PTEXTO || '",' || ' "id": "' || VS_SERIAL || ' }' || ' } '; -- dbms_output.put_line(url); dbms_output.put_line(content); -- --req := utl_http.begin_request(url,'POST'); req := utl_http.begin_request(url, 'POST',https_host =>'???????'); utl_http.set_header(req, 'Content-Type', 'application/json'); utl_http.set_header(req, 'Content-Length', length(content)); utl_http.set_header(req, 'Authorization', 'Basic ' || utl_encode.base64_encode(VS_AUTHOR_64)); -- utl_http.write_text(req, content); res := utl_http.get_response(req); begin loop utl_http.read_line(res, buffer); end loop; utl_http.end_response(res); exception when utl_http.end_of_body then utl_http.end_response(res); end; dbms_output.put_line('retorno ' || buffer); exception when others then PRETORNO := 'Erro : ' || UTL_HTTP.GET_DETAILED_SQLERRM; end;  
    • By Thiago Btos
      Boa tarde pessoal.
       
      Estou travado em uma parte do select do qual preciso somar os valores de todos os registros da coluna, e usa-lo como base de calculo para outra coluna
       
      SELECT PRODUTO, HORAS, QTDE, VARIACAO FROM DUAL
       
      Meu select está retornando algo assim:
       
      PRODUTO | HORAS | QTDE | VARIACAO
            A           |    2        |    20    |      5
            B           |    6        |    25    |      3
            C           |    5        |    70    |      9
            D           |    8        |    30    |      2
      --------------------------------------------------------
      Total           |    21     |  145    |      
       
      Preciso criar uma nova coluna com a formula (Total Qtde / Total horas) * variação ficando assim:
      PRODUTO | HORAS | QTDE | VARIACAO | CONTA
            A           |    2        |    20    |      5             |  34.52
            B           |    6        |    25    |      3             |  20.71
            C           |    5        |    70    |      9             |  62.14
            D           |    8        |    30    |      2             |  13.80
       
       
      A forma que estou tentando fazer é via subselect, mas ele não agrupa todas as linhas, e somente o registro da linha atual.
      SELECT PRODUTO, HORAS, QTDE, VARIACAO,
          (SELECT (SUM(QTDE) / SUM(HORAS)) * VARIACAO) AS CONTA
      FROM DUAL
       
      Dessa forma me retorna o seguinte resultado, como se estive calculando somente a linha atual e não toda a coluna.
      PRODUTO | HORAS | QTDE | VARIACAO | CONTA
            A           |    2        |    20    |      5             |  50
            B           |    6        |    25    |      3             |  12.5
            C           |    5        |    70    |      9             |  126
            D           |    8        |    30    |      2             |  7.5
       
       
       
      Espero que eu tenha conseguido explicar minha necessidade de forma que de para entender.
       
×

Important Information

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