Ir para conteúdo

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

 

 

 

   

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Citar

Falta apenas diminuir as colunas de data

 

 

!?

Compartilhar este post


Link para o post
Compartilhar em outros 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;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por douglas.ribeiro.id
      Bom dia a todos
       
      a varios anos que nao tenho que criar um script no oracle nao consigo lembrar ne como começar e tambem estou sem o oracle instalado na maquina
      alguem poderia me ajudar? o problema e este: 
      Crie um segundo script (SCRIPT2.SQL) que possua um bloco de código para que gere registros fictícios para as tabelas criadas. Gere 1000 registros para a tabela EXAME_NF. Para cada EXAME_NF gere 3 registros. Faça com que a DATACADASTRO do EXAME_NF comece em 10 dias atrás, fazendo com que a cada 100 registros a data seja aumentada em 1 dia, distribuindo assim os 1000 registros em 10 dias diferentes de cadastro.
    • Por stewartcintra@
      Tenho um sistema de contas em php mysql, preciso exibir todas as contas do mes agrupadas por categoria e o campo valorR$ para saber o total em reais de cada categoria.
      Não estou conseguindo, como posso fazer isso?
    • Por MateusDuarte
      Podem me ajudar? Sou novato em PHP e estou precisando de uma ajudinha.
      Tenho 2 tabelas no banco: filmes e generos.
      Faço o cadastro individual de todos os generos na tabela generos, e no cadastro de filmes eu puxo todos os generos por um multiple select. Até ai tudo certo, ele salva no banco de dados assim:
      genero1, genero2, genero3.
       
      Porém na hora de mostrar eu não sei separar eles das virgulas.
      Segue meu SELECT simples:
      <main class="content"> <?php $sql = "SELECT * FROM genero ORDER BY RAND()"; $result = $connect->query($sql); if($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $teste = $row["id_genero"]; ?> <section class="panel"> <h2><a id="links-generos" href="generos-filmes.php?id=<?php echo $row['id_genero'];?>"><?php echo $row["descricao"];?></a></h2> <div class="recentslider"> <div class="swiper-container"> <div class="swiper-wrapper"> <?php $sql_t = "SELECT * FROM filmes WHERE id_genero = ".$teste." ORDER BY RAND()"; $result_t = $connect->query($sql_t); if($result_t->num_rows > 0) { while($row_t = $result_t->fetch_assoc()) { ?> <div class="swiper-slide"><?php echo "<a href='single-filmes.php?id=".$row_t['id_filme']."&genero=".$row_t['id_genero']."';>";?><img src="capa/<?php echo $row_t["capa_filme"];?>"><h3 class="hometitle"><?php echo $row_t["titulo_filme"];?></h3></a></div> <?php }} else { echo "0 results"; } ?> </div> <div class="nextdirection recent-next"><img src="img/right-arrow.svg"> </div> <div class="leftdirection recent-prev"><img src="img/left-arrow.svg"> </div> </div> </div> </section> <?php }} else { echo "0 results"; } ?> </main> (Desculpa se não ficou alinhado, só copiei e colei.)

      Reparem que primeiro dou um select na tabela genero, e salvo o ID dela em uma variavel, e depois vou um select na tabela filmes usando a variavel que salvei antes como uma condição.
      Porem na tabela filmes, os generos estão salvos separados por virgula. Como consigo fazer um select separando ela das virgulas?
       
    • Por GustavoJacob15
      Quando eu executo esse fonte, trás o resultado triplicado
       
       
       
      SELECT CN9_NUMERO AS 'CONTRATO', CONVERT(DATE, SUBSTRING(CN9_DTINIC, 1, 4) + '-' + SUBSTRING(CN9_DTINIC, 5, 2) + '-' + SUBSTRING(CN9_DTINIC, 7, 2)) AS 'DT INICIO', CONVERT(DATE, SUBSTRING(CN9_DTFIM, 1, 4) + '-' + SUBSTRING(CN9_DTFIM, 5, 2) + '-' + SUBSTRING(CN9_DTFIM, 7, 2)) AS 'DT FIM', CN9_NUMERO AS 'CENTRO DE CUSTO', CN9_ZZEMTI AS 'ART EMITIDA', CONVERT(DATE,CN9_ZZDTVA) AS 'VALIDADE DA ART', CN9_VLATU AS 'VALOR CONTRATO', CNC_CLIENT AS 'CLIENTE', CNC_LOJACL AS 'LOJA CLIENTE', A1_NOME AS 'NOME CLIENTE', CNE_PEDIDO AS 'PEDIDO', CNE_PERC AS 'PERCENTUAL', C6_NOTA AS 'NOTA FISCAL', E1_NUM AS 'NUMERO', CNE_REVISA, CONVERT(DATE,E1_BAIXA) AS 'DT BAIXA', CNF_VLPREV AS 'VALOR PREVISTO', CNF_PARCEL AS 'PARCELA', CONVERT(DATE,CNF_DTVENC) AS 'VENCIMENTO' FROM CN9010 CN9 INNER JOIN CNC010 CNC ON CNC.CNC_NUMERO = CN9.CN9_NUMERO AND CNC.D_E_L_E_T_ ='' INNER JOIN SA1010 A1 ON CNC.CNC_CLIENT = A1.A1_COD AND CNC.CNC_LOJACL = A1.A1_LOJA AND A1.D_E_L_E_T_ ='' INNER JOIN CNF010 CNF ON CNF.CNF_CONTRA = CN9.CN9_NUMERO AND CN9.D_E_L_E_T_='' INNER JOIN CNE010 CNE ON CNE.CNE_CONTRA = CNF.CNF_CONTRA AND CNE.D_E_L_E_T_='' INNER JOIN SC6010 C6 ON C6.C6_NUM = CNE.CNE_PEDIDO AND C6.D_E_L_E_T_ ='' INNER JOIN SE1010 E1 ON E1.E1_NUM = C6.C6_NOTA AND E1.D_E_L_E_T_ ='' AND E1.E1_TIPO ='NF' WHERE CN9.D_E_L_E_T_='' AND CN9_NUMERO = '201000272' AND CN9_REVISA = '002' AND CN9.D_E_L_E_T_='' AND CNF_CONTRA = '201000272' AND CNF_REVISA = '002' AND CNF.D_E_L_E_T_='' AND CNE_CONTRA = '201000272' AND CNE_REVISA = '002' AND CNE.D_E_L_E_T_='' AND E1_PREFIXO = 'SRV' AND CNC_NUMERO = '201000272' AND CNC_REVISA = '002' GROUP BY CN9_NUMERO,CN9_REVISA,CN9_DTINIC,CN9_DTFIM,CN9_NUMERO,CN9_ZZEMTI,CN9_ZZDTVA,CN9_VLATU,CNC_CLIENT,CNC_LOJACL, A1_NOME, CNE_PEDIDO, CNE_PERC, C6_NOTA, E1_NUM, CNE_REVISA, E1_BAIXA, CNF_VLPREV, CNF_PARCEL, CNF_DTVENC  
    • Por Jonatas Provido
      Pessoal veja se consegue me ajudar 
      Hoje tenho uma  TABELA1 e TABELA2
      Tabela =  TABELA1
      Colunas = NCM
                         IPOS_FEDER
                         IPOS_MUNIC
                         IPOS_GLOBAL
                         IPOS_ESTAD
      A Tabela2 onde esta com as informações novas que precisa ser atualizado a Tabela1
      TABELA = TABELA2
      COLUNAS = NCM
                            FEDERAL
                            MUNICIP
                            GLOBAL
                            ESTADU
                       
      Preciso que compare o coluna NCM as demais coluna se diferente valor tabela 2 atualiza a tabela1 
       
      já li vários post porem acho que a forma que estou pesquisando não seja coerente. 
      Obrigado! pela atenção

       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.