none
consulta sql mes a mes na coluna RRS feed

  • Pergunta

  • bom dia a todos,

    Preciso fazer uma consulta no sql onde preciso obter o seguinte resultado:

    PROJETO     TOTAL -JANEIRO -FEVEREIRO- MARÇO
    PROJETO1 90 10 30 50
    PROJETO2 9 2 2 5

    alguem poderia me ajudar?

    obrigado

    quinta-feira, 2 de fevereiro de 2017 13:20

Respostas

  • Acrdito que a forma do seu exemplo você vai utilizar PIVOT 

    fiz um exemplo com os dados que você demostrou

    DECLARE @tableProjetos TABLE
            (
              IdProjeto INT IDENTITY(1, 1) ,
              Nome VARCHAR(MAX)
            );
    
    
    DECLARE @tableAtividades TABLE
            (
              IdAtividade INT PRIMARY KEY
                              IDENTITY(1, 1) ,
              IdProjeto INT ,
              Data DATE ,
              Quantidade INT
            );
    
    INSERT  INTO @tableProjetos
            ( Nome )
    VALUES  ( 'PROJETO1' ),
            ( 'PROJETO2' );
    
    INSERT  INTO @tableAtividades
            ( IdProjeto, Data, Quantidade )
    VALUES  ( 1, DATEFROMPARTS(2016, 1, 1), 5 ),
            ( 1, DATEFROMPARTS(2016, 1, 10), 5 ),
            ( 1, DATEFROMPARTS(2016, 2, 10), 15 ),
            ( 1, DATEFROMPARTS(2016, 2, 10), 15 ),
            ( 1, DATEFROMPARTS(2016, 3, 10), 20 ),
            ( 1, DATEFROMPARTS(2016, 3, 10), 30 ),
            ( 2, DATEFROMPARTS(2016, 1, 01), 1 ),
            ( 2, DATEFROMPARTS(2016, 1, 10), 1 ),
            ( 2, DATEFROMPARTS(2016, 2, 10), 1 ),
            ( 2, DATEFROMPARTS(2016, 2, 10), 1 ),
            ( 2, DATEFROMPARTS(2016, 3, 01), 3 ),
            ( 2, DATEFROMPARTS(2016, 3, 01), 2 );
           
    
    WITH    DadosPivot
              AS ( SELECT   TP.Nome AS NomeProjeto ,
                            MONTH(TA.Data) AS Mes ,
                            SUM(TA.Quantidade) AS Quantidade
                   FROM     @tableProjetos AS TP
                            JOIN @tableAtividades AS TA ON TA.IdProjeto = TP.IdProjeto
                   GROUP BY TP.Nome ,
                            TA.Data
                 )
         SELECT PivotTable.NomeProjeto ,
                Janeiro = [1] ,
                Fevereiro = [2] ,
                Março = [3] ,
                Total = ( [1] + [2] + [3] )
         FROM   DadosPivot R PIVOT( SUM(Quantidade) FOR Mes IN ( [1], [2], [3] ) ) AS PivotTable;
    	 
    
    
    
    --	    TOTAL	  -JANEIRO	 -FEVEREIRO-	MARÇO
    --PROJETO1	90			10		30			50
    --PROJETO2	9			2		2			5
    

    seque a documentação 

    https://technet.microsoft.com/pt-br/library/ms177410(v=sql.105).aspx

    Por favor,  marque-o como respondidas se está respondeu a sua pergunta 
    ou marcá-lo como útil se está ajudou a resolver o seu problema 
    Wesley Neves
    MTA-Database Fundamentals 
    Analista Desenvolvedor.NET


    Wesley Neves

    quinta-feira, 2 de fevereiro de 2017 14:39
  • Bom dia!

    No seu select, faltou fazer o agrupamento do campo mês e não da data original, evitando agrupamento errado, segue:

    WITH DadosPivot AS ( SELECT TP.Nome AS NomeProjeto , MONTH(TA.Data) AS Mes , SUM(TA.Quantidade) AS Quantidade FROM @tableProjetos AS TP JOIN @tableAtividades AS TA ON TA.IdProjeto = TP.IdProjeto GROUP BY TP.Nome , MONTH(TA.Data) ) ...

    Segue novamente o código informado logo acima, que acredito ser à resolução, realizei algumas modificação para evitar agrupamento da data informada no CASE WHEN: 

    SELECT SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '01' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS JANUARY,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '02' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS FEBRUARY,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '03' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS MARCH,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '04' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS APRIL,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '05' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS MAY,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '06' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS JUNE,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '07' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS JULY,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '08' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS August,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '09' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS SEPTEMBER,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '10' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS OCTOBER,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '11' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS NOVEMBER,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '12' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS DECEMBER
    FROM Banco.dbo.TABLE
    GROUP BY TABLE.CAMPO_DESCRICAO_PROJETO




    • Marcado como Resposta ppsantos2002 quinta-feira, 2 de fevereiro de 2017 16:38
    quinta-feira, 2 de fevereiro de 2017 16:25
  • ppsantos2002,

    Você esta extraindo os meses com base na sua coluna data?

    Poderia postar o código que esta utilizando?

    Acredito que inicialmente você esta fazendo um agrupamento por mês no seu select!!!!

    Veja se este exemplo pode te ajudar:

    USE tempdb;
    
    IF OBJECT_ID('dbo.Orders', 'U') IS NOT NULL DROP TABLE dbo.Orders;
    GO
    
    CREATE TABLE dbo.Orders
    (
      orderid   INT        NOT NULL,
      orderdate DATE       NOT NULL, 
      empid     INT        NOT NULL,
      custid    VARCHAR(5) NOT NULL,
      qty       INT        NOT NULL,
      CONSTRAINT PK_Orders PRIMARY KEY(orderid)
    );
    
    INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
    VALUES
      (30001, '20070802', 3, 'A', 10),
      (10001, '20071224', 2, 'A', 12),
      (10005, '20071224', 1, 'B', 20),
      (40001, '20080109', 2, 'A', 40),
      (10006, '20080118', 1, 'C', 14),
      (20001, '20080212', 2, 'B', 12),
      (40005, '20090212', 3, 'A', 10),
      (20002, '20090216', 1, 'C', 20),
      (30003, '20090418', 2, 'B', 15),
      (30004, '20070418', 3, 'C', 22),
      (30007, '20090907', 3, 'D', 30);
    
    
    -- Query against Orders, grouping by employee and customer
    SELECT empid, custid, SUM(qty) AS sumqty
    FROM dbo.Orders
    GROUP BY empid, custid;
    
    ---------------------------------------------------------------------
    -- Pivoting with Standard SQL
    ---------------------------------------------------------------------
    
    -- Query against Orders, grouping by employee, pivoting customers,
    -- aggregating sum of quantity
    SELECT empid,
      SUM(CASE WHEN custid = 'A' THEN qty END) AS A,
      SUM(CASE WHEN custid = 'B' THEN qty END) AS B,
      SUM(CASE WHEN custid = 'C' THEN qty END) AS C,
      SUM(CASE WHEN custid = 'D' THEN qty END) AS D  
    FROM dbo.Orders
    GROUP BY empid;
    
    ---------------------------------------------------------------------
    -- Pivoting with the Native T-SQL PIVOT Operator
    ---------------------------------------------------------------------
    
    -- Logical equivalent of previous query using the native PIVOT operator
    SELECT empid, A, B, C, D
    FROM (SELECT empid, custid, qty FROM dbo.Orders) AS D
      PIVOT(SUM(qty) FOR custid IN(A, B, C, D)) AS P;
    
    -- Query demonstrating the problem with implicit grouping
    SELECT empid, A, B, C, D
    FROM dbo.Orders
      PIVOT(SUM(qty) FOR custid IN(A, B, C, D)) AS P;
    
    -- Logical equivalent of previous query
    SELECT empid,
      SUM(CASE WHEN custid = 'A' THEN qty END) AS A,
      SUM(CASE WHEN custid = 'B' THEN qty END) AS B,
      SUM(CASE WHEN custid = 'C' THEN qty END) AS C,
      SUM(CASE WHEN custid = 'D' THEN qty END) AS D  
    FROM dbo.Orders
    GROUP BY orderid, orderdate, empid;
    
    -- Query against Orders, grouping by customer, pivoting employees,
    -- aggregating sum of quantity
    SELECT custid, [1], [2], [3]
    FROM (SELECT empid, custid, qty
          FROM dbo.Orders) AS D
      PIVOT(SUM(qty) FOR empid IN([1], [2], [3])) AS P;


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    quinta-feira, 2 de fevereiro de 2017 14:10

Todas as Respostas

  • Olá, 

    Por favor, explique melhor o que você precisa.

    As informações estão todas em uma unica tabela ? Esses totais o que são ? Quais são os nomes dos campos ?  

    Fico no aguardo. 
    quinta-feira, 2 de fevereiro de 2017 13:31
  • Bom dia!

    Você pode utilizar o CASE WHEN no campo de data, por exemplo:

    SELECT CASE WHEN MONTH(TABLE.CAMPO_DATA) = '01' 
                 THEN SUM(TABLE.CAMO_VALUE) ELSE 0 END AS JANUARY,
           CASE WHEN MONTH(TABLE.CAMPO_DATA) = '02' 
                 THEN SUM(TABLE.CAMO_VALUE) ELSE 0 END AS FEBRUARY,
           CASE WHEN MONTH(TABLE.CAMPO_DATA) = '03' 
                 THEN SUM(TABLE.CAMO_VALUE) ELSE 0 END AS MARCH
    FROM Banco.dbo.TABLE

    OBS: É um exemplo, acho que dar para ter uma ideia.

    Qualquer dúvida é só perguntar.

     

    quinta-feira, 2 de fevereiro de 2017 13:52
  • Ola Julio,

    Sim as informações estão em uma única tabela, o total é a soma na linha para os meses que irão ficar coluna e os meses estão no campo de um DATETIME.

    PROJETO TOTAL JANEIRO FEVEREIRO MARÇO
    PROJETO 1 10 5 2 3
    PROJETO 2 5 3 2 0

    os nomes dos campos são:

    projetoa, data_evento.

    veja se ficou claro, sou novo em programação...

    quinta-feira, 2 de fevereiro de 2017 14:01
  • ppsantos2002,

    Você esta extraindo os meses com base na sua coluna data?

    Poderia postar o código que esta utilizando?

    Acredito que inicialmente você esta fazendo um agrupamento por mês no seu select!!!!

    Veja se este exemplo pode te ajudar:

    USE tempdb;
    
    IF OBJECT_ID('dbo.Orders', 'U') IS NOT NULL DROP TABLE dbo.Orders;
    GO
    
    CREATE TABLE dbo.Orders
    (
      orderid   INT        NOT NULL,
      orderdate DATE       NOT NULL, 
      empid     INT        NOT NULL,
      custid    VARCHAR(5) NOT NULL,
      qty       INT        NOT NULL,
      CONSTRAINT PK_Orders PRIMARY KEY(orderid)
    );
    
    INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
    VALUES
      (30001, '20070802', 3, 'A', 10),
      (10001, '20071224', 2, 'A', 12),
      (10005, '20071224', 1, 'B', 20),
      (40001, '20080109', 2, 'A', 40),
      (10006, '20080118', 1, 'C', 14),
      (20001, '20080212', 2, 'B', 12),
      (40005, '20090212', 3, 'A', 10),
      (20002, '20090216', 1, 'C', 20),
      (30003, '20090418', 2, 'B', 15),
      (30004, '20070418', 3, 'C', 22),
      (30007, '20090907', 3, 'D', 30);
    
    
    -- Query against Orders, grouping by employee and customer
    SELECT empid, custid, SUM(qty) AS sumqty
    FROM dbo.Orders
    GROUP BY empid, custid;
    
    ---------------------------------------------------------------------
    -- Pivoting with Standard SQL
    ---------------------------------------------------------------------
    
    -- Query against Orders, grouping by employee, pivoting customers,
    -- aggregating sum of quantity
    SELECT empid,
      SUM(CASE WHEN custid = 'A' THEN qty END) AS A,
      SUM(CASE WHEN custid = 'B' THEN qty END) AS B,
      SUM(CASE WHEN custid = 'C' THEN qty END) AS C,
      SUM(CASE WHEN custid = 'D' THEN qty END) AS D  
    FROM dbo.Orders
    GROUP BY empid;
    
    ---------------------------------------------------------------------
    -- Pivoting with the Native T-SQL PIVOT Operator
    ---------------------------------------------------------------------
    
    -- Logical equivalent of previous query using the native PIVOT operator
    SELECT empid, A, B, C, D
    FROM (SELECT empid, custid, qty FROM dbo.Orders) AS D
      PIVOT(SUM(qty) FOR custid IN(A, B, C, D)) AS P;
    
    -- Query demonstrating the problem with implicit grouping
    SELECT empid, A, B, C, D
    FROM dbo.Orders
      PIVOT(SUM(qty) FOR custid IN(A, B, C, D)) AS P;
    
    -- Logical equivalent of previous query
    SELECT empid,
      SUM(CASE WHEN custid = 'A' THEN qty END) AS A,
      SUM(CASE WHEN custid = 'B' THEN qty END) AS B,
      SUM(CASE WHEN custid = 'C' THEN qty END) AS C,
      SUM(CASE WHEN custid = 'D' THEN qty END) AS D  
    FROM dbo.Orders
    GROUP BY orderid, orderdate, empid;
    
    -- Query against Orders, grouping by customer, pivoting employees,
    -- aggregating sum of quantity
    SELECT custid, [1], [2], [3]
    FROM (SELECT empid, custid, qty
          FROM dbo.Orders) AS D
      PIVOT(SUM(qty) FOR empid IN([1], [2], [3])) AS P;


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    quinta-feira, 2 de fevereiro de 2017 14:10
  • SELECT p.NOME_PROJETO, COUNT(ID) as TOTAL, DATA_EVENTO,
    (SELECT COUNT(distinct ID) FROM XXX_AGENDA_2R WHERE MONTH (h.DATA_EVENTO) ='1') as jan  
    FROM XXX_AGENDA_2R h
    INNER JOIN tbl_PROJETOS AS p ON p.PROJETO_COD=h.PROJETO
     GROUP BY h.DATA_EVENTO,p.NOME_PROJETO


    quinta-feira, 2 de fevereiro de 2017 14:17
  • Acrdito que a forma do seu exemplo você vai utilizar PIVOT 

    fiz um exemplo com os dados que você demostrou

    DECLARE @tableProjetos TABLE
            (
              IdProjeto INT IDENTITY(1, 1) ,
              Nome VARCHAR(MAX)
            );
    
    
    DECLARE @tableAtividades TABLE
            (
              IdAtividade INT PRIMARY KEY
                              IDENTITY(1, 1) ,
              IdProjeto INT ,
              Data DATE ,
              Quantidade INT
            );
    
    INSERT  INTO @tableProjetos
            ( Nome )
    VALUES  ( 'PROJETO1' ),
            ( 'PROJETO2' );
    
    INSERT  INTO @tableAtividades
            ( IdProjeto, Data, Quantidade )
    VALUES  ( 1, DATEFROMPARTS(2016, 1, 1), 5 ),
            ( 1, DATEFROMPARTS(2016, 1, 10), 5 ),
            ( 1, DATEFROMPARTS(2016, 2, 10), 15 ),
            ( 1, DATEFROMPARTS(2016, 2, 10), 15 ),
            ( 1, DATEFROMPARTS(2016, 3, 10), 20 ),
            ( 1, DATEFROMPARTS(2016, 3, 10), 30 ),
            ( 2, DATEFROMPARTS(2016, 1, 01), 1 ),
            ( 2, DATEFROMPARTS(2016, 1, 10), 1 ),
            ( 2, DATEFROMPARTS(2016, 2, 10), 1 ),
            ( 2, DATEFROMPARTS(2016, 2, 10), 1 ),
            ( 2, DATEFROMPARTS(2016, 3, 01), 3 ),
            ( 2, DATEFROMPARTS(2016, 3, 01), 2 );
           
    
    WITH    DadosPivot
              AS ( SELECT   TP.Nome AS NomeProjeto ,
                            MONTH(TA.Data) AS Mes ,
                            SUM(TA.Quantidade) AS Quantidade
                   FROM     @tableProjetos AS TP
                            JOIN @tableAtividades AS TA ON TA.IdProjeto = TP.IdProjeto
                   GROUP BY TP.Nome ,
                            TA.Data
                 )
         SELECT PivotTable.NomeProjeto ,
                Janeiro = [1] ,
                Fevereiro = [2] ,
                Março = [3] ,
                Total = ( [1] + [2] + [3] )
         FROM   DadosPivot R PIVOT( SUM(Quantidade) FOR Mes IN ( [1], [2], [3] ) ) AS PivotTable;
    	 
    
    
    
    --	    TOTAL	  -JANEIRO	 -FEVEREIRO-	MARÇO
    --PROJETO1	90			10		30			50
    --PROJETO2	9			2		2			5
    

    seque a documentação 

    https://technet.microsoft.com/pt-br/library/ms177410(v=sql.105).aspx

    Por favor,  marque-o como respondidas se está respondeu a sua pergunta 
    ou marcá-lo como útil se está ajudou a resolver o seu problema 
    Wesley Neves
    MTA-Database Fundamentals 
    Analista Desenvolvedor.NET


    Wesley Neves

    quinta-feira, 2 de fevereiro de 2017 14:39
  • Bom dia!

    No seu select, faltou fazer o agrupamento do campo mês e não da data original, evitando agrupamento errado, segue:

    WITH DadosPivot AS ( SELECT TP.Nome AS NomeProjeto , MONTH(TA.Data) AS Mes , SUM(TA.Quantidade) AS Quantidade FROM @tableProjetos AS TP JOIN @tableAtividades AS TA ON TA.IdProjeto = TP.IdProjeto GROUP BY TP.Nome , MONTH(TA.Data) ) ...

    Segue novamente o código informado logo acima, que acredito ser à resolução, realizei algumas modificação para evitar agrupamento da data informada no CASE WHEN: 

    SELECT SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '01' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS JANUARY,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '02' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS FEBRUARY,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '03' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS MARCH,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '04' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS APRIL,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '05' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS MAY,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '06' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS JUNE,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '07' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS JULY,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '08' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS August,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '09' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS SEPTEMBER,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '10' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS OCTOBER,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '11' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS NOVEMBER,
           SUM(CASE WHEN MONTH(TABLE.CAMPO_DATA) = '12' 
                 THEN TABLE.CAMO_VALUE 
                 ELSE 0 
           END) AS DECEMBER
    FROM Banco.dbo.TABLE
    GROUP BY TABLE.CAMPO_DESCRICAO_PROJETO




    • Marcado como Resposta ppsantos2002 quinta-feira, 2 de fevereiro de 2017 16:38
    quinta-feira, 2 de fevereiro de 2017 16:25
  • Obrigado resolveu o meu problema e agradeço a todos pela ajuda.

    Avatar de Wesley Neves

    Wesley Neves

    quinta-feira, 2 de fevereiro de 2017 16:38