1
resposta

Usei a Function DATEPART na solução do exemplo do video

Vou deixar minha solução aqui, bem parecida com a lógica do video, porém sem fazer a conversão da data para varchar (fez mais sentindo para mim deixar a data como data mesmo)

SELECT a.[NOME],
       a.ANO_COMPRA,
       a.MES_COMPRA,
       a.QUANTIDADE_COMPRADA,
       CASE
          WHEN a.[VOLUME DE COMPRA]  < a.QUANTIDADE_COMPRADA THEN 'VENDA INVÁLIDA'
          WHEN a.[VOLUME DE COMPRA] >= a.QUANTIDADE_COMPRADA THEN 'VENDA VÁLIDA'
       END AS STATUS_VENDA
FROM (SELECT [NOTAS FISCAIS].CPF,
             [TABELA DE CLIENTES].NOME,
             DATEPART(YEAR, [NOTAS FISCAIS].DATA) AS ANO_COMPRA,
             DATEPART(MONTH, [NOTAS FISCAIS].DATA) AS MES_COMPRA, 
             SUM([ITENS NOTAS FISCAIS].[QUANTIDADE]) AS QUANTIDADE_COMPRADA,
             [TABELA DE CLIENTES].[VOLUME DE COMPRA]
      FROM [NOTAS FISCAIS]
           INNER JOIN [ITENS NOTAS FISCAIS]
             ON [NOTAS FISCAIS].NUMERO = [ITENS NOTAS FISCAIS].NUMERO
             INNER JOIN [TABELA DE CLIENTES]
             ON [NOTAS FISCAIS].CPF = [TABELA DE CLIENTES].CPF
      GROUP BY [NOTAS FISCAIS].CPF,
               [TABELA DE CLIENTES].NOME,
               DATEPART(YEAR, [NOTAS FISCAIS].DATA),
               DATEPART(MONTH, [NOTAS FISCAIS].DATA),
               [TABELA DE CLIENTES].[VOLUME DE COMPRA]) as a
ORDER BY a.NOME, a.MES_COMPRA, a.ANO_COMPRA

Meu marido é analista e me ensinou um outra forma, com o comando CROSS APPLY e OUTER APPLY, legal que usando o OUTER APPLY lista uma linha a mais, com um cliente que não comprou nada.

SELECT Clientes.[NOME],
       Notas.ANO_COMPRA, 
       Notas.MES_COMPRA,
       Notas.QUANTIDADE_COMPRADA,
       CASE
          WHEN Clientes.[VOLUME DE COMPRA]  < Notas.QUANTIDADE_COMPRADA THEN 'VENDA INVÁLIDA'
          WHEN Clientes.[VOLUME DE COMPRA] >= Notas.QUANTIDADE_COMPRADA THEN 'VENDA VÁLIDA'
          ELSE 'Não existe nota para este CPF: '+Clientes.CPF
       END AS STATUS_VENDA
FROM [TABELA DE CLIENTES] AS Clientes
     --// OUTER APPLY tem a mesma funcionalidade do LEFT JOIN, ou seja, 
     --// NÃO irá obrigar a ter dados nas duas tabelas envolvidas
     OUTER APPLY (SELECT DATEPART(YEAR, Notas.DATA) AS ANO_COMPRA, 
                         DATEPART(MONTH, Notas.DATA) AS MES_COMPRA, 
                         SUM(Notas_Itens.QUANTIDADE) AS QUANTIDADE_COMPRADA
                  FROM [NOTAS FISCAIS] AS Notas
                       INNER JOIN [ITENS NOTAS FISCAIS] AS Notas_Itens
                         ON Notas_Itens.NUMERO = Notas.NUMERO
                  WHERE Notas.CPF = Clientes.CPF
                  GROUP BY DATEPART(YEAR, Notas.DATA),
                           DATEPART(MONTH, Notas.DATA)) AS Notas
     --// CROSS APPLY tem a mesma funcionalidade do INNER JOIN, ou seja, 
     --// irá obrigar a ter dados nas duas tabelas envolvidas
     --CROSS APPLY (SELECT DATEPART(YEAR, Notas.DATA) AS ANO_COMPRA, 
     --                    DATEPART(MONTH, Notas.DATA) AS MES_COMPRA, 
     --                    SUM(Notas_Itens.QUANTIDADE) AS QUANTIDADE_COMPRADA
     --             FROM [NOTAS FISCAIS] AS Notas
     --                  INNER JOIN [ITENS NOTAS FISCAIS] AS Notas_Itens
        --                 ON Notas_Itens.NUMERO = Notas.NUMERO
     --             WHERE Notas.CPF = Clientes.CPF
     --             GROUP BY DATEPART(YEAR, Notas.DATA),
     --                      DATEPART(MONTH, Notas.DATA)) AS Notas
ORDER BY Clientes.Nome, Notas.ANO_COMPRA, Notas.MES_COMPRA
1 resposta

Oi, Vanessa! Tudo certo?

Desde já, peço desculpas pela demora em te responder.

Obrigada por compartilhar essas diferentes maneiras de desenvolver o relatório de vendas válidas! Além disso, parabéns pelo cuidado e pela dedicação no desenvolvimento dos SELECTs, isso mostra o seu comprometimento nos estudos.

Com certeza os conhecimentos que você trouxe serão úteis para as outras pessoas quem também estão realizando este curso.

Caso surja alguma dúvida ao decorrer dos seus estudos, fico à disposição.

Abraço.