none
Dúvida ao calcular valores separando por meses RRS feed

  • Pergunta

  • Pessoal boa tarde, estou com uma dificuldade aqui:

    Tenho duas tabelas a de clientes e a de vendas, porem preciso efetuar uma query que traga o valor total mas por mes, exemplo

    Janeiro Fev Março Abril...

    O campo que tenho como referencia e a data de emissão da venda, preciso setar o ano de 2015 e ele mostra as colunas para cada mes com o total

    quero somar todas as vendas dentro de cada mes, realmente estou com dificuldades, algum colega poderia dar uma luz?

    Muito obrigado.

    segunda-feira, 24 de agosto de 2015 19:18

Respostas

  • SELECT 
        [1] AS Jan,
        [2] AS Fev,
        [3] AS Mar,
        [4] AS Abr,
        [5] AS Mai,
        [6] AS Jun,
        [7] AS Jul,
        [8] AS Ago,
        [9] AS [Set],
        [10] AS [Out],
        [11] AS Nov,
        [12] AS Dez
    FROM
    (
    SELECT 
       TMOV.CODCFO AS 'CÓDIGO DO CLIENTE',
       FCFO.NOME AS 'NOME',
       DATEPART (MONTH, (TMOV.DATAEMISSAO)) as 'MÊS', 
       SUM (TMOV.VALORBRUTO) AS totalmes 
    FROM 
       TMOV (NOLOCK)
       INNER JOIN FLAN (NOLOCK) ON FLAN.IDMOV = TMOV.IDMOV
       INNER JOIN FCFO (NOLOCK) ON FCFO.CODCFO = TMOV.CODCFO
       INNER JOIN TITMMOV (NOLOCK) ON TITMMOV.IDMOV = TMOV.IDMOV
       INNER JOIN TPRODUTO (NOLOCK)ON TPRODUTO.IDPRD = TITMMOV.IDPRD
       LEFT JOIN TITMMOVHISTORICO (NOLOCK) ON TITMMOVHISTORICO.NSEQITMMOV = TITMMOV.NSEQITMMOV AND TITMMOVHISTORICO.IDMOV = TMOV.IDMOV
    WHERE 
       TMOV.CODCOLIGADA = '3' AND
       TMOV.CODFILIAL = '100' AND
       TMOV.CODTMV = '2.2.03' AND
       DATEPART (YEAR, FLAN.DATAEMISSAO) = '2015' AND
       TITMMOV.IDPRD = '12110' AND
       TMOV.STATUS <> 'C' AND
       FCFO.CGCCFO <> '222.222.222-22' AND
       TITMMOVHISTORICO.HISTORICOLONGO LIKE 'RECEBIMENTO DE APOSENTADORIA%'
    GROUP BY 
       TMOV.CODCFO,
       FCFO.NOME,
       DATEPART (MONTH, (TMOV.DATAEMISSAO))
    
    ) AS Vendas
    PIVOT
    (
    SUM(totalmes)
    FOR MÊS IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
    ) AS PivotTable;
    att

    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    • Marcado como Resposta diegobuenosantos segunda-feira, 24 de agosto de 2015 20:58
    segunda-feira, 24 de agosto de 2015 20:30

Todas as Respostas

  • Deste jeito:

    select Datepart(month, data_emissao_venda) as mes, sum(valor) from vendas
    where Datepart(year, data_emissao_venda) =2015
    group by  Datepart(month, data_emissao_venda) 

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    segunda-feira, 24 de agosto de 2015 19:30
  • Perfect!

    pra eu quebrar cada coluna pra cada mes, visto que sao varios clientes, posso usar o case? existe outra forma mais pratica?

    Obrigado.


    Forum SQL Server

    segunda-feira, 24 de agosto de 2015 19:44
  • neste caso tem que usar o pivot, veja esse exemplo:

    SELECT *
    FROM (SELECT Cliente.nome, 
           DATENAME(MONTH, dataemissao) mes, 
           sum(vendas) as totalmes
          FROM vendas inner join cliente on vendas.clienteid=cliente.id
          GROUP BY DATENAME(MONTH, dataemissao),Cliente.nome
    PIVOT( SUM(totalmes)   
        FOR Month IN ([Janeiro],[Fevereiro],[Março],[Abril],[Maio],
        [Junho],[Julho],[Agosta],[Setembro],[Outubro],[Novembro],
        [Dezembro])) AS MeuPivot
    mais ou menos assim.. sem conhecer suas tabelas fica dificil uma resposta exata.


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    segunda-feira, 24 de agosto de 2015 20:02
  • Boa tarde,

    Você poderia utilizar Pivot dessa forma:

    SELECT 
        [1] AS Jan,
        [2] AS Fev,
        [3] AS Mar,
        [4] AS Abr,
        [5] AS Mai,
        [6] AS Jun,
        [7] AS Jul,
        [8] AS Ago,
        [9] AS [Set],
        [10] AS [Out],
        [11] AS Nov,
        [12] AS Dez
    FROM
    (select Datepart(month, data_emissao_venda) as mes, sum(valor) as valor from vendas
    where Datepart(year, data_emissao_venda) =2015
    group by  Datepart(month, data_emissao_venda)
    ) AS Vendas
    PIVOT
    (
    SUM(valor)
    FOR mes IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
    ) AS PivotTable;



    Wesley Lisboa

    segunda-feira, 24 de agosto de 2015 20:08
  • o que voces me passaram ja esta funcionando, esta sao as tabelas, só preciso mesmo de uma coluna para cada mes

    SELECT 
       TMOV.CODCFO AS 'CÓDIGO DO CLIENTE',
       FCFO.NOME AS 'NOME',
       DATEPART (MONTH, (TMOV.DATAEMISSAO)) as 'MÊS', 
       SUM (TMOV.VALORBRUTO) AS totalmes 
    FROM 
       TMOV (NOLOCK)
       INNER JOIN FLAN (NOLOCK) ON FLAN.IDMOV = TMOV.IDMOV
       INNER JOIN FCFO (NOLOCK) ON FCFO.CODCFO = TMOV.CODCFO
       INNER JOIN TITMMOV (NOLOCK) ON TITMMOV.IDMOV = TMOV.IDMOV
       INNER JOIN TPRODUTO (NOLOCK)ON TPRODUTO.IDPRD = TITMMOV.IDPRD
       LEFT JOIN TITMMOVHISTORICO (NOLOCK) ON TITMMOVHISTORICO.NSEQITMMOV = TITMMOV.NSEQITMMOV AND TITMMOVHISTORICO.IDMOV = TMOV.IDMOV
    WHERE 
       TMOV.CODCOLIGADA = '3' AND
       TMOV.CODFILIAL = '100' AND
       TMOV.CODTMV = '2.2.03' AND
       DATEPART (YEAR, FLAN.DATAEMISSAO) = '2015' AND
       TITMMOV.IDPRD = '12110' AND
       TMOV.STATUS <> 'C' AND
       FCFO.CGCCFO <> '222.222.222-22' AND
       TITMMOVHISTORICO.HISTORICOLONGO LIKE 'RECEBIMENTO DE APOSENTADORIA%'
    GROUP BY 
       TMOV.CODCFO,
       FCFO.NOME,
       DATEPART (MONTH, (TMOV.DATAEMISSAO))


    Forum SQL Server


    segunda-feira, 24 de agosto de 2015 20:22
  • SELECT 
        [1] AS Jan,
        [2] AS Fev,
        [3] AS Mar,
        [4] AS Abr,
        [5] AS Mai,
        [6] AS Jun,
        [7] AS Jul,
        [8] AS Ago,
        [9] AS [Set],
        [10] AS [Out],
        [11] AS Nov,
        [12] AS Dez
    FROM
    (
    SELECT 
       TMOV.CODCFO AS 'CÓDIGO DO CLIENTE',
       FCFO.NOME AS 'NOME',
       DATEPART (MONTH, (TMOV.DATAEMISSAO)) as 'MÊS', 
       SUM (TMOV.VALORBRUTO) AS totalmes 
    FROM 
       TMOV (NOLOCK)
       INNER JOIN FLAN (NOLOCK) ON FLAN.IDMOV = TMOV.IDMOV
       INNER JOIN FCFO (NOLOCK) ON FCFO.CODCFO = TMOV.CODCFO
       INNER JOIN TITMMOV (NOLOCK) ON TITMMOV.IDMOV = TMOV.IDMOV
       INNER JOIN TPRODUTO (NOLOCK)ON TPRODUTO.IDPRD = TITMMOV.IDPRD
       LEFT JOIN TITMMOVHISTORICO (NOLOCK) ON TITMMOVHISTORICO.NSEQITMMOV = TITMMOV.NSEQITMMOV AND TITMMOVHISTORICO.IDMOV = TMOV.IDMOV
    WHERE 
       TMOV.CODCOLIGADA = '3' AND
       TMOV.CODFILIAL = '100' AND
       TMOV.CODTMV = '2.2.03' AND
       DATEPART (YEAR, FLAN.DATAEMISSAO) = '2015' AND
       TITMMOV.IDPRD = '12110' AND
       TMOV.STATUS <> 'C' AND
       FCFO.CGCCFO <> '222.222.222-22' AND
       TITMMOVHISTORICO.HISTORICOLONGO LIKE 'RECEBIMENTO DE APOSENTADORIA%'
    GROUP BY 
       TMOV.CODCFO,
       FCFO.NOME,
       DATEPART (MONTH, (TMOV.DATAEMISSAO))
    
    ) AS Vendas
    PIVOT
    (
    SUM(totalmes)
    FOR MÊS IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
    ) AS PivotTable;
    att

    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    • Marcado como Resposta diegobuenosantos segunda-feira, 24 de agosto de 2015 20:58
    segunda-feira, 24 de agosto de 2015 20:30
  • Wilian perfeito mesmo, mas você fez este em qual versão do sql server?

    ta dando pra mim essa mensagem, se eu nao estiver errado, esta dizendo que eu preciso acertar a versao  

    Incorrect syntax near 'PIVOT'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the SET COMPATIBILITY_LEVEL option of ALTER DATABASE.


    Forum SQL Server


    segunda-feira, 24 de agosto de 2015 20:35
  • Pessoal deu certo, essa mensagem era para o nível de compatibilidade.

    fiz a alteração em uma base de testes e deu certo

    Obrigado a todos, vocês mandam mto...

    abraços


    Forum SQL Server

    segunda-feira, 24 de agosto de 2015 20:59