-- Explicando: -- Este texto exemplifica uma Fase 3 do PraticaSQL. -- ---------------------------------------------------------------------------------------------------------------------------------------- -- -- Sobre o Modelo 3 da Base de Dados podemos elaborar a pergunta: -- Exiba a lista com os 5 nomes dos clientes com maior soma dos valores comprados, nos últimos 180 dias -- e dos respectivos valores. -- -- A resolução de questões da fase 3 consite em etapas, que são: -- 1) Determinar as tabelas que vão permitr responder a questão. -- Tabelas [e campos] envolvidos na resposta desta pergunta: clientes[cpcliente, txnomecliente] e nfvendas[dtvenda, vltotalnfvenda]. -- 2) Elaborar a resposta em AR -- Resposta em AR -- Seleção.....: A = nfvendas [[ (Data_Atual - dtvenda ) < 180 ]] -- Projeção....: B = A [[ cecliente, SOMA(vltotalnfvenda)->vTotal ]] agrupado por cecliente ordenado por cecliente -- Projeção....: C = B [[ cecliente, vTotal ]] ordenado por vTotal limitado em 5 -- Junção Fech.: D = C [[ c.cecliente=clientes.cpcliente ]] clientes -- Projeção....: D [[ txnomecliente, vtotal ]] -- 3)'Tradução' da AR para SQL -- Resposta em SQL -- Seleção.....: A = nfvendas [[ (Data_Atual - dtvenda ) < 180 ]] create temporary table A as (select * from nfvendas where current_date-dtvenda < 180); -- Projeção....: B = A [[ cecliente, SOMA(vltotalnfvenda)->vTotal ]] agrupado por cecliente ordenado por cecliente create temporary table B as (select cecliente, sum(vltotalnfvenda) as vTotal from A group by cecliente order by cecliente); -- Projeção....: C = B [[ cecliente, vTotal ]] ordenado por vTotal limitado em 5 create temporary table C as (select cecliente, vTotal from B order by vTotal DESC limit 5); -- Junção Fech.: D = C [[ c.cpcliente=clientes.cpcliente ]] clientes create temporary table D as (select * from C inner join clientes on C.cecliente=clientes.cpcliente); select txnomecliente, vtotal from D order by txnomecliente; -- 4) Processar os comandos em uma interface para o SGBD. -- Usando o pgAdmin 4 (ou programa equivalente), tente executar a sequencia de comandos SQL nas tabelas da base de dados. -- Nota: - No processamento proposto na AR e traduzido para a SQL verifica-se a NÃO existencia de valores. -- Isso acontece porque os dados apontados na tabela nfvendas são anteriores à 180 dias. -- Essa situação pode ser 'resolvid' com o aumento no intervalo de dias e daí a obtenção de dados plausíveis. -- Com a proposta do processamento. Foi testado o valor de 5000 dias e os dados foram processados de modo correto. -- Para conseguir 'rodar' a sequência de comandos [script] novamente, é necessário 'deletar' as tabelas criadas -- na primeira 'rodada'. Para isso acrescentamos o comando SQL 'drop table A,B,C,D;' -- - 'drop table' é um comando DDL (assim como o 'CREATE TABLE'). -- - Em algumas situações podem ser necessários se introduzir novas operações de projeções para determinar dados mais precisos -- para a sequencia de comandos executados na SQL. NESTA questão, esta situação não ocorre.