1
resposta

Resolução

Primeiro entendi pelo diagrama do banco onde estão as informação. depois fui montando um InnerJoin por vez.

SELECT CONCAT( 'O cliente ', NOTAS.NOME, 'comprou R$', STR(SUM(NOTAS.TOTAL),10,2), ' no ano de ', YEAR(NOTAS.DATA_VENDA) ) FROM ( SELECT TOTAL, CLIENTES.NOME, NOTAS.DATA_VENDA FROM (SELECT NF.NUMERO,NF.CPF,NF.DATA_VENDA ,(INF.QUANTIDADE*INF.PRECO) AS TOTAL FROM NOTAS_FISCAIS NF INNER JOIN ITENS_NOTAS_FISCAIS INF ON NF.NUMERO = INF.NUMERO) NOTAS INNER JOIN TABELA_DE_CLIENTES CLIENTES ON NOTAS.CPF = CLIENTES.CPF) NOTAS WHERE YEAR(NOTAS.DATA_VENDA) = '2016' GROUP BY YEAR(NOTAS.DATA_VENDA), NOTAS.NOME

1 resposta

Oi Cristin,

Parabéns pela sua dedicação em construir a query passo a passo com INNER JOIN! 👏

Sua abordagem de começar pelo diagrama do banco é excelente para entender a relação entre as tabelas.

A sua query está bem estruturada e resolve o problema proposto.

No entanto, para otimizar a leitura e performance, você pode simplificar a consulta usando JOIN diretamente entre as tabelas NOTAS_FISCAIS, ITENS_NOTAS_FISCAIS e TABELA_DE_CLIENTES, evitando subconsultas aninhadas.

Além disso, a função STR não é necessária, pois o CONCAT já converte o valor numérico para texto.

Veja um exemplo:

SELECT 
    CONCAT( 'O cliente ', TC.NOME, ' comprou R$', SUM(INF.QUANTIDADE * INF.PRECO), ' no ano de ', YEAR(NF.DATA_VENDA) )
FROM NOTAS_FISCAIS NF
INNER JOIN ITENS_NOTAS_FISCAIS INF ON NF.NUMERO = INF.NUMERO
INNER JOIN TABELA_DE_CLIENTES TC ON NF.CPF = TC.CPF
WHERE YEAR(NF.DATA_VENDA) = '2016'
GROUP BY YEAR(NF.DATA_VENDA), TC.NOME;

Essa versão é mais concisa e fácil de entender, mantendo o mesmo resultado. 👍

Para saber mais: Documentação oficial do SQL Server sobre a função CONCAT.

Continue praticando e explorando as funcionalidades do SQL! 🤔