none
Dificuldade em montar uma query - SQL Server 2008 RRS feed

  • Pergunta

  • Pessoal boa noite, alguem poderia me ajudar na seguinte questão...

    abaixo tenho uma query que basicamente tras valores por mes, vejam abaixo a query:

    é uma teabela onde eu quero colocar em linha por mes, janeiro, fevereiro e etc.

    mas o resultado retorna 12 linhas, eu entendo, pois ela esta rodando pra todos os meses, mas no caso, como eu teria que fazer para que ficasse em linha, pois por exemplo na coluna JANEIRO ele tras ok, mas até ele imprimir o valor de DEZEMBRO, ele coloca 11 linhas em branco (NULL) coloquei o print do resultado abaixo da query

    Obrigado!!

    select 
        CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '1' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Janeiro',
        CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '2' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Fevereiro',
        CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '3' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Março',
        CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '4' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Abril',
        CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '5' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Mail',
        CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '6' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Junho',
        CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '7' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Julho',
        CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '8' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Agosto',
        CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '9' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Setembro',
        CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '10' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Outubro',
        CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '11' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Novembro',
        CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '12' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Dezembro'
    from 
       TORCAMENTO
       inner join TTBORCAMENTO on TTBORCAMENTO.CODTBORCAMENTO = TORCAMENTO.CODTBORCAMENTO
       inner join TITMORCAMENTO on TITMORCAMENTO.IDORCAMENTO = TORCAMENTO.IDORCAMENTO
       left join TITMPERIODOORCAMENTO on TITMPERIODOORCAMENTO.IDPERIODO = TORCAMENTO.IDPERIODO 
    
       WHERE
       TORCAMENTO.CODTBORCAMENTO = '1.001.001'
     

    Abaixo o resultado da query


    Forum SQL Server

    terça-feira, 20 de setembro de 2016 02:21

Respostas

  • Tenta assim:

    IF OBJECT_ID('TEMPDB..#Teste') IS NOT NULL

    BEGIN

      DROP TABLE #Teste;

    END

    CREATE TABLE #Teste ( ID_Fatura     Integer Identity PRIMARY KEY,

                          ID_Empresa    Integer NOT NULL,

                          ID_Fornecedor Integer NOT NULL,

                          DT_Fatura     SmallDateTime NOT NULL,

                          VL_Fatura     Numeric(9,2) NOT NULL );

    CREATE INDEX ix_ ON #Teste ( ID_Empresa , ID_Fornecedor, DT_Fatura ) INCLUDE (VL_Fatura);

    INSERT INTO #TESTE VALUES  (1, 698, '2015-01-03' , 144.10 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-02-02' , 50.00 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-03-25' , 55.47 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-04-11' , 40.20 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-05-04' , 99.35 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-06-12' , 13.25 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-07-11' , 20.00 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-08-31' , 7.40 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-09-07' , 10.00 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-10-08' , 22.42 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-11-15' , 14.13 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-12-15' , 10.00 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-01-08' , 135.56 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-01-15' , 35.50 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-02-20' , 45.35 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-03-10' , 36.20 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-04-05' , 45.29 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-04-16' , 50.40 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-04-30' , 13.30 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-05-11' , 18.20 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-05-31' , 7.40 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-06-07' , 91.37 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-07-08' , 100.20 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-07-15' , 14.13 );

             

    SELECT YEAR(DT_Fatura) Ano,

           SUM(CASE WHEN MONTH(DT_Fatura) = 01 THEN VL_Fatura ELSE 0 END) AS [Jan],

           SUM(CASE WHEN MONTH(DT_Fatura) = 02 THEN VL_Fatura ELSE 0 END) AS [Fev],

           SUM(CASE WHEN MONTH(DT_Fatura) = 03 THEN VL_Fatura ELSE 0 END) AS [Mar],

           SUM(CASE WHEN MONTH(DT_Fatura) = 04 THEN VL_Fatura ELSE 0 END) AS [Abr],

           SUM(CASE WHEN MONTH(DT_Fatura) = 05 THEN VL_Fatura ELSE 0 END) AS [Mai],

           SUM(CASE WHEN MONTH(DT_Fatura) = 06 THEN VL_Fatura ELSE 0 END) AS [Jun],

           SUM(CASE WHEN MONTH(DT_Fatura) = 07 THEN VL_Fatura ELSE 0 END) AS [Jul],

           SUM(CASE WHEN MONTH(DT_Fatura) = 08 THEN VL_Fatura ELSE 0 END) AS [Ago],

           SUM(CASE WHEN MONTH(DT_Fatura) = 09 THEN VL_Fatura ELSE 0 END) AS [Set],

           SUM(CASE WHEN MONTH(DT_Fatura) = 10 THEN VL_Fatura ELSE 0 END) AS [Out],

           SUM(CASE WHEN MONTH(DT_Fatura) = 11 THEN VL_Fatura ELSE 0 END) AS [Nov],

           SUM(CASE WHEN MONTH(DT_Fatura) = 12 THEN VL_Fatura ELSE 0 END) AS [Dez],

           SUM(VL_Fatura) AS [Total]

    FROM #Teste (NOLOCK)

    WHERE ID_Empresa = 1

      AND ID_Fornecedor = 698

    GROUP BY Year(DT_Fatura);

    • Sugerido como Resposta Zé Bill terça-feira, 20 de setembro de 2016 16:37
    terça-feira, 20 de setembro de 2016 16:37
  • Deleted
    terça-feira, 20 de setembro de 2016 16:47

Todas as Respostas

  • Deleted
    terça-feira, 20 de setembro de 2016 11:42
  • Olá José, boa tarde

    e o SQL srver 2008R2, mas o pivot eu nao consigo utilizar por causa do nivel de compatibilidade da base, que por causa da aplicação nao permite o pivot.

    Mas vou testar o envelopamento em cada linha, achei uma boa.

    Obrigado pela dica.


    Forum SQL Server

    terça-feira, 20 de setembro de 2016 14:53
  • Diego,

    Neste caso, o que você teria que fazer é criar um Pivot artificial, ou seja, armazenar em uma determinada tabela justamente este agrupamento de dados organizados por mês de acordo com suas movimentações, após isso você vai conseguir apresentar os dados de maneira organizada sem ter os valores em nulo.

    Algo como se fosse um sumário da sua movimentação anual, especificando os períodos desejados de datas e durante a execução deste período ir armazenando estes dados resumidos contendo os meses de movimentação de cada período.

    Ao final você apresenta justamente estes dados sumarizados no decorrer de um ano, todo este processo poderia ser realizar por uma stored procedure e a apresentação dos dados através de uma visão indexada para ajudar na busca e apresentação dos dados.


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

    terça-feira, 20 de setembro de 2016 15:41
  • Tenta assim:

    IF OBJECT_ID('TEMPDB..#Teste') IS NOT NULL

    BEGIN

      DROP TABLE #Teste;

    END

    CREATE TABLE #Teste ( ID_Fatura     Integer Identity PRIMARY KEY,

                          ID_Empresa    Integer NOT NULL,

                          ID_Fornecedor Integer NOT NULL,

                          DT_Fatura     SmallDateTime NOT NULL,

                          VL_Fatura     Numeric(9,2) NOT NULL );

    CREATE INDEX ix_ ON #Teste ( ID_Empresa , ID_Fornecedor, DT_Fatura ) INCLUDE (VL_Fatura);

    INSERT INTO #TESTE VALUES  (1, 698, '2015-01-03' , 144.10 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-02-02' , 50.00 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-03-25' , 55.47 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-04-11' , 40.20 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-05-04' , 99.35 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-06-12' , 13.25 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-07-11' , 20.00 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-08-31' , 7.40 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-09-07' , 10.00 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-10-08' , 22.42 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-11-15' , 14.13 );

    INSERT INTO #TESTE VALUES  (1, 698, '2015-12-15' , 10.00 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-01-08' , 135.56 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-01-15' , 35.50 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-02-20' , 45.35 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-03-10' , 36.20 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-04-05' , 45.29 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-04-16' , 50.40 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-04-30' , 13.30 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-05-11' , 18.20 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-05-31' , 7.40 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-06-07' , 91.37 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-07-08' , 100.20 );

    INSERT INTO #TESTE VALUES  (1, 698, '2016-07-15' , 14.13 );

             

    SELECT YEAR(DT_Fatura) Ano,

           SUM(CASE WHEN MONTH(DT_Fatura) = 01 THEN VL_Fatura ELSE 0 END) AS [Jan],

           SUM(CASE WHEN MONTH(DT_Fatura) = 02 THEN VL_Fatura ELSE 0 END) AS [Fev],

           SUM(CASE WHEN MONTH(DT_Fatura) = 03 THEN VL_Fatura ELSE 0 END) AS [Mar],

           SUM(CASE WHEN MONTH(DT_Fatura) = 04 THEN VL_Fatura ELSE 0 END) AS [Abr],

           SUM(CASE WHEN MONTH(DT_Fatura) = 05 THEN VL_Fatura ELSE 0 END) AS [Mai],

           SUM(CASE WHEN MONTH(DT_Fatura) = 06 THEN VL_Fatura ELSE 0 END) AS [Jun],

           SUM(CASE WHEN MONTH(DT_Fatura) = 07 THEN VL_Fatura ELSE 0 END) AS [Jul],

           SUM(CASE WHEN MONTH(DT_Fatura) = 08 THEN VL_Fatura ELSE 0 END) AS [Ago],

           SUM(CASE WHEN MONTH(DT_Fatura) = 09 THEN VL_Fatura ELSE 0 END) AS [Set],

           SUM(CASE WHEN MONTH(DT_Fatura) = 10 THEN VL_Fatura ELSE 0 END) AS [Out],

           SUM(CASE WHEN MONTH(DT_Fatura) = 11 THEN VL_Fatura ELSE 0 END) AS [Nov],

           SUM(CASE WHEN MONTH(DT_Fatura) = 12 THEN VL_Fatura ELSE 0 END) AS [Dez],

           SUM(VL_Fatura) AS [Total]

    FROM #Teste (NOLOCK)

    WHERE ID_Empresa = 1

      AND ID_Fornecedor = 698

    GROUP BY Year(DT_Fatura);

    • Sugerido como Resposta Zé Bill terça-feira, 20 de setembro de 2016 16:37
    terça-feira, 20 de setembro de 2016 16:37
  • Deleted
    terça-feira, 20 de setembro de 2016 16:47
  • Fantastico

    Obrigado.


    Forum SQL Server

    quinta-feira, 22 de setembro de 2016 02:41