none
calcular media por mes e ano

    Question

  • Prezados boa tarde, estou precisando da ajuda de vcs, na SQL abaixo me traz os lancamentos por mes e ano, corretamente, porem eu preciso saber qual a Diferença em % de mes pro outro e ano vejam:

    SELECT  
             YEAR = year(DATAEMISSAO),
             CODCCUSTO,
             Jan = SUM(CASE month(DATAEMISSAO)
                         WHEN 1 THEN VALORBRUTO   ELSE 0   END),
             Feb = SUM(CASE month(DATAEMISSAO)
                         WHEN 2 THEN VALORBRUTO   ELSE 0   END),
             Mar = SUM(CASE month(DATAEMISSAO)
                         WHEN 3 THEN VALORBRUTO   ELSE 0   END),
             Apr = SUM(CASE month(DATAEMISSAO)
                         WHEN 4 THEN VALORBRUTO   ELSE 0   END),
             May = SUM(CASE month(DATAEMISSAO)
                         WHEN 5 THEN VALORBRUTO   ELSE 0   END),
             Jun = SUM(CASE month(DATAEMISSAO)
                        WHEN 6 THEN VALORBRUTO    ELSE 0   END),
             Jul = SUM(CASE month(DATAEMISSAO)
                         WHEN 7 THEN VALORBRUTO   ELSE 0   END),
             Aug = SUM(CASE month(DATAEMISSAO)
                         WHEN 8 THEN VALORBRUTO   ELSE 0   END),
             Sep = SUM(CASE month(DATAEMISSAO)
                         WHEN 9 THEN VALORBRUTO   ELSE 0   END),
             Oct = SUM(CASE month(DATAEMISSAO)
                         WHEN 10 THEN VALORBRUTO  ELSE 0   END),
             Nov = SUM(CASE month(DATAEMISSAO)
                         WHEN 11 THEN VALORBRUTO  ELSE 0   END),
             [Dec] = SUM(CASE month(DATAEMISSAO)
                         WHEN 12 THEN VALORBRUTO  ELSE 0   END)
    FROM     TMOV
    WHERE TMOV.CODTMV = '2.2.01'
    AND TMOV.CODCCUSTO  ='02.0043'
    GROUP BY
             year(DATAEMISSAO),TMOV.CODCCUSTO
    ORDER BY year(DATAEMISSAO)

    GO

    resultado

    Ano       Obra            JAN

    2010      02.0043       0.0000
    2011      02.0043       10
    2012      02.0043       5

    Resultado esperado

    Ano       Obra            JAN

    2011      02.0043       10
    2012      02.0043       5

    Media                       - 50%

    e assim mes por mes, comparando ANO E MES.

    Obrigado a todos pela ajuda.

     
    Friday, March 23, 2012 3:25 PM

Answers

  • Ronnie,

    Tenho uma sugestão. Você já pensou em utilizar o Grouping Sets?

    Veja abaixo o exemplo:

    -- Desabilitando a contagem de linhas --
    Set NoCount On;
    -- Verificando se a Tabela OrdemProducao já esta cadastrada --
    If OBJECT_ID('dbo.OrdemProducao','U') Is Not Null
     Drop Table dbo.OrdemProducao
    Go
    -- Criando a Tabela OrdemProducao --
    Create Table OrdemProducao
     (NumProducao Int Not Null,
      Data Date Not Null,
      CodFuncionario Int Not Null,
      Setor Varchar(2) Not Null, 
      Quantidade Int Not Null         
     ) 
    Go
    -- Adicionando Chave Primária na Tabela OrdemProducao --
    Alter Table OrdemProducao
     Add Constraint [PK_OrdemProducao_NumProducao] Primary Key Clustered (NumProducao)
    Go 
    -- Inserindo dados na Tabela OrdemProducao --
    Insert Into OrdemProducao (NumProducao, Data, CodFuncionario, Setor, Quantidade)
    Values 
    (1000, '20091001',1,'A',20),
    (1001, '20091002',2,'B',30),
    (1002, '20091003',3,'D',15),
    (1003, '20091005',2,'D',12),
    (2000, '20100210',4,'C',40),
    (2001, '20100211',4,'C',35),
    (2002, '20100312',2,'A',22),
    (2004, '20100414',2,'B',12),			  
    (3005, '20110601',1,'C',50),
    (3006, '20110602',3,'B',60)
    Insert Into OrdemProducao (NumProducao, Data, CodFuncionario, Setor, Quantidade)
    Values 
    (10000, '20091001',1,'A',20),
    (10001, '20091002',2,'B',30),
    (10002, '20091003',3,'D',15),
    (10003, '20091005',2,'D',12),
    (20000, '20100210',4,'C',40),
    (20001, '20100211',4,'C',35),
    (20002, '20100312',2,'A',22),
    (20004, '20100414',2,'B',12),			  
    (30005, '20110601',1,'C',50),
    (30006, '20110602',3,'B',60)
    -- Aplicando o Grouping Sets (Setor, CodFuncionario e AnoProducao) na Tabela OrdemProducao --
    Select Setor, CodFuncionario, YEAR(Data) As 'Ano de Produção', SUM(Quantidade) As Soma
    from dbo.OrdemProducao
    Group By GROUPING Sets
    (
     (Setor, CodFuncionario, YEAR(DATA)) 
    )
    Go
    -- Aplicando o Grouping Sets (Setor, CodFuncionario e AnoProducao + AnoProd) na Tabela OrdemProducao --
    Select Setor, CodFuncionario, YEAR(Data) As 'Ano de Produção', SUM(Quantidade) As Soma
    from dbo.OrdemProducao
    Group By GROUPING Sets
    (
     (Setor, CodFuncionario, YEAR(DATA)),
     (YEAR(Data))
    )
    Go
    -- Simultando o Grouping Sets utilizando Union All --
    Select Setor, CodFuncionario, YEAR(Data) As 'Ano de Produção', SUM(Quantidade) As Soma
    from dbo.OrdemProducao
    Group By Setor, CodFuncionario, YEAR(Data)
    Union All
    Select Null As Setor, Null As CodFuncionario, YEAR(Data) As 'Ano de Produção', SUM(Quantidade) As Soma
    from dbo.OrdemProducao
    Group By YEAR(Data)


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    Wednesday, March 28, 2012 4:22 PM

All replies

  • Ronnie

    Esta um pouco confuso, como estão os dados em sua tabela e como vc deseja o reusltado?


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    Friday, March 23, 2012 9:20 PM
  • Ronnie,

    Tenho uma sugestão. Você já pensou em utilizar o Grouping Sets?

    Veja abaixo o exemplo:

    -- Desabilitando a contagem de linhas --
    Set NoCount On;
    -- Verificando se a Tabela OrdemProducao já esta cadastrada --
    If OBJECT_ID('dbo.OrdemProducao','U') Is Not Null
     Drop Table dbo.OrdemProducao
    Go
    -- Criando a Tabela OrdemProducao --
    Create Table OrdemProducao
     (NumProducao Int Not Null,
      Data Date Not Null,
      CodFuncionario Int Not Null,
      Setor Varchar(2) Not Null, 
      Quantidade Int Not Null         
     ) 
    Go
    -- Adicionando Chave Primária na Tabela OrdemProducao --
    Alter Table OrdemProducao
     Add Constraint [PK_OrdemProducao_NumProducao] Primary Key Clustered (NumProducao)
    Go 
    -- Inserindo dados na Tabela OrdemProducao --
    Insert Into OrdemProducao (NumProducao, Data, CodFuncionario, Setor, Quantidade)
    Values 
    (1000, '20091001',1,'A',20),
    (1001, '20091002',2,'B',30),
    (1002, '20091003',3,'D',15),
    (1003, '20091005',2,'D',12),
    (2000, '20100210',4,'C',40),
    (2001, '20100211',4,'C',35),
    (2002, '20100312',2,'A',22),
    (2004, '20100414',2,'B',12),			  
    (3005, '20110601',1,'C',50),
    (3006, '20110602',3,'B',60)
    Insert Into OrdemProducao (NumProducao, Data, CodFuncionario, Setor, Quantidade)
    Values 
    (10000, '20091001',1,'A',20),
    (10001, '20091002',2,'B',30),
    (10002, '20091003',3,'D',15),
    (10003, '20091005',2,'D',12),
    (20000, '20100210',4,'C',40),
    (20001, '20100211',4,'C',35),
    (20002, '20100312',2,'A',22),
    (20004, '20100414',2,'B',12),			  
    (30005, '20110601',1,'C',50),
    (30006, '20110602',3,'B',60)
    -- Aplicando o Grouping Sets (Setor, CodFuncionario e AnoProducao) na Tabela OrdemProducao --
    Select Setor, CodFuncionario, YEAR(Data) As 'Ano de Produção', SUM(Quantidade) As Soma
    from dbo.OrdemProducao
    Group By GROUPING Sets
    (
     (Setor, CodFuncionario, YEAR(DATA)) 
    )
    Go
    -- Aplicando o Grouping Sets (Setor, CodFuncionario e AnoProducao + AnoProd) na Tabela OrdemProducao --
    Select Setor, CodFuncionario, YEAR(Data) As 'Ano de Produção', SUM(Quantidade) As Soma
    from dbo.OrdemProducao
    Group By GROUPING Sets
    (
     (Setor, CodFuncionario, YEAR(DATA)),
     (YEAR(Data))
    )
    Go
    -- Simultando o Grouping Sets utilizando Union All --
    Select Setor, CodFuncionario, YEAR(Data) As 'Ano de Produção', SUM(Quantidade) As Soma
    from dbo.OrdemProducao
    Group By Setor, CodFuncionario, YEAR(Data)
    Union All
    Select Null As Setor, Null As CodFuncionario, YEAR(Data) As 'Ano de Produção', SUM(Quantidade) As Soma
    from dbo.OrdemProducao
    Group By YEAR(Data)


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    Wednesday, March 28, 2012 4:22 PM
  • Junior Desculpa a Demora, vou simular aqui e ja retorno.
    Friday, March 30, 2012 2:36 PM