none
Erro o gerar pivot de uma consulta RRS feed

  • Pergunta

  • Tenho a seguinte query:

    SELECT
     FIN.ANOCOMP AS ANO,
     FIN.MESCOMP AS MES,
     FIN.CHAPA   AS CAPA,
     FUNC.NOME   AS NOME,
     FUNC.SECAO  AS COD_SECAO,
     FUNC.NSECAO AS NOME_SECAO,
     FUNC.FUNCAO AS COD_FUNCAO,
     FNCAO.NOME  AS NOME_FUNCAO,
     SUM( FIN.HORA  )    AS HORA,
     SUM( FIN.VALOR )   AS VALOR
     
    	FROM PFFINANC AS FIN
     
     INNER JOIN vwFUNC AS FUNC
     ON  FUNC.CHAPA    = FIN.CHAPA
     AND FUNC.COLIGADA = FIN.CODCOLIGADA
     
     INNER JOIN PFUNCAO AS FNCAO
     ON  FNCAO.CODIGO  = FUNC.FUNCAO
    	WHERE 
    	FIN.CODCOLIGADA = 1
    	AND FIN.CODEVENTO     = 185
    	
    	GROUP BY 
    	FIN.MESCOMP,FIN.ANOCOMP,FIN.CHAPA,FIN.CHAPA,
    	FUNC.NOME,FUNC.NOME,FUNC.SECAO,FUNC.NSECAO,FUNC.FUNCAO,
    	FNCAO.NOME
    	
    	ORDER BY FUNC.NOME,FIN.ANOCOMP,FIN.MESCOMP;

    Preciso passar para um pivot para mudar a exibição dos meses, fiz da seguinte forma:

    SELECT		   
    	FIN.ANOCOMP
    	, FIN.CHAPA   AS CAPA
        , FUNC.NOME   AS NOME
        , FUNC.SECAO  AS COD_SECAO
        , FUNC.NSECAO AS NOME_SECAO
        , FUNC.FUNCAO AS COD_FUNCAO
        , FNCAO.NOME  AS NOME_FUNCAO
    	, [1] AS JANEIRO
    	, [2] AS FEVEREIRO
    	, [3] AS MARÇO
    	, [4] AS ABRIL
    	, [5] AS MAIO
    	, [6] AS JUNHO
    	, [7] AS JULHO
    	, [8] AS AGOSTO
    	, [9] AS SETEMBRO
    	, [10] AS OUTUBRO
    	, [11] AS NOVEMBRO
    	, [12] AS DEZEMBRO
    		 	FROM PFFINANC AS FIN
     INNER JOIN vwFUNC AS FUNC
     ON  FUNC.CHAPA    = FIN.CHAPA
     AND FUNC.COLIGADA = FIN.CODCOLIGADA
     INNER JOIN PFUNCAO AS FNCAO
     ON  FNCAO.CODIGO  = FUNC.FUNCAO
    	WHERE 
    	FIN.CODCOLIGADA    = 1
    	AND FIN.CODEVENTO  = 185
    	GROUP BY 
    	FIN.ANOCOMP,FIN.MESCOMP
    	PIVOT(
    	 SUM( FIN.HORA  )    AS HORA,
    	 SUM( FIN.VALOR )   AS VALOR
    	FOR FIN.MESCOMP IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]))P
    	ORDER BY FIN.ANOCOMP

    Só que ele retorna o seguinte erro:

    Mensagem 325, Nível 15, Estado 1, Linha 32
    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.

    Eu consigo gerar esse pivot ou alguma consulta assim sempre precisar do:

    ALTER DATABASE

    OBS: SQL SERVER 2008



    • Editado otaciojb quinta-feira, 8 de agosto de 2019 15:04
    quinta-feira, 8 de agosto de 2019 15:03

Respostas

  • Deleted
    • Marcado como Resposta otaciojb quinta-feira, 8 de agosto de 2019 19:13
    quinta-feira, 8 de agosto de 2019 16:15
  • SELECT
     FIN.ANOCOMP AS ANO,
     -- FIN.MESCOMP AS MES,
     FIN.CHAPA   AS CAPA,
     FUNC.NOME   AS NOME,
     FUNC.SECAO  AS COD_SECAO,
     FUNC.NSECAO AS NOME_SECAO,
     FUNC.FUNCAO AS COD_FUNCAO,
     FNCAO.NOME  AS NOME_FUNCAO, 
     SUM (CASE WHEN FIN.MESCOMP = 1  THEN FIN.HORA   END) AS [H_JAN],
     SUM (CASE WHEN FIN.MESCOMP = 1  THEN FIN.VALOR  END) AS [T_JAN],
     SUM (CASE WHEN FIN.MESCOMP = 2  THEN FIN.HORA   END) AS [H_FEV],
     SUM (CASE WHEN FIN.MESCOMP = 2  THEN FIN.VALOR  END) AS [T_FEV],
     SUM (CASE WHEN FIN.MESCOMP = 3  THEN FIN.HORA   END) AS [H_MAR],
     SUM (CASE WHEN FIN.MESCOMP = 3  THEN FIN.VALOR  END) AS [T_MAR],
     SUM (CASE WHEN FIN.MESCOMP = 4  THEN FIN.HORA   END) AS [H_ABR],
     SUM (CASE WHEN FIN.MESCOMP = 4  THEN FIN.VALOR  END) AS [T_ABR],
     SUM (CASE WHEN FIN.MESCOMP = 5  THEN FIN.HORA   END) AS [H_MAI],
     SUM (CASE WHEN FIN.MESCOMP = 5  THEN FIN.VALOR  END) AS [T_MAI],
     SUM (CASE WHEN FIN.MESCOMP = 6  THEN FIN.HORA   END) AS [H_JUN],
     SUM (CASE WHEN FIN.MESCOMP = 6  THEN FIN.VALOR  END) AS [T_JUN],
     SUM (CASE WHEN FIN.MESCOMP = 7  THEN FIN.HORA   END) AS [H_JUL],
     SUM (CASE WHEN FIN.MESCOMP = 7  THEN FIN.VALOR  END) AS [T_JUL],
     SUM (CASE WHEN FIN.MESCOMP = 8  THEN FIN.HORA   END) AS [H_AGO],
     SUM (CASE WHEN FIN.MESCOMP = 8  THEN FIN.VALOR  END) AS [T_AGO],
     SUM (CASE WHEN FIN.MESCOMP = 9  THEN FIN.HORA   END) AS [H_SET],
     SUM (CASE WHEN FIN.MESCOMP = 9  THEN FIN.VALOR  END) AS [T_SET],
     SUM (CASE WHEN FIN.MESCOMP = 10 THEN FIN.HORA   END) AS [H_OUT],
     SUM (CASE WHEN FIN.MESCOMP = 10 THEN FIN.VALOR  END) AS [T_OUT],
     SUM (CASE WHEN FIN.MESCOMP = 11 THEN FIN.HORA   END) AS [H_NOV],
     SUM (CASE WHEN FIN.MESCOMP = 11 THEN FIN.VALOR  END) AS [T_NOV],
     SUM (CASE WHEN FIN.MESCOMP = 12 THEN FIN.HORA   END) AS [H_DEZ],
     SUM (CASE WHEN FIN.MESCOMP = 12 THEN FIN.VALOR  END) AS [T_DEZ]
     	
    	FROM PFFINANC AS FIN (NOLOCK)
     
     INNER JOIN vwFUNC AS FUNC
     ON  FUNC.CHAPA    = FIN.CHAPA
     AND FUNC.COLIGADA = FIN.CODCOLIGADA
     
     INNER JOIN PFUNCAO AS FNCAO
     ON  FNCAO.CODIGO  = FUNC.FUNCAO
    	WHERE 
    	FIN.CODCOLIGADA   = 1
    	AND FIN.CODEVENTO = 185
    	AND FIN.CHAPA     = 0015
    	AND FIN.ANOCOMP   = 2018
    	GROUP BY 
    	FIN.ANOCOMP,FIN.MESCOMP,FIN.CHAPA,FIN.CHAPA,
    	FUNC.NOME,FUNC.NOME,FUNC.SECAO,FUNC.NSECAO,FUNC.FUNCAO,
    	FNCAO.NOME
    
    ORDER BY FUNC.NOME,FIN.ANOCOMP,FIN.MESCOMP;

    José Diz,

     Veja se entendi errado, pois ainda esta dando erro.

    Fiz como esta lá na documentação, e deu certo, mais porem, ainda exibe as 12 linhas dos meses,  mais com o paramento que fiz ai de consultas, teria que mostrar somente 1 linha.

    Estou entendendo que é porque o mes, esta lá no rodapé no group by, mais se eu tirar ele, da o seguinte erro:

    Mensagem 8127, Nível 16, Estado 1, Linha 53
    Column "PFFINANC.MESCOMP" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.
    

    Sabe me dizer como posso tratar esse erro ?

    quinta-feira, 8 de agosto de 2019 16:05

Todas as Respostas

  • Deleted
    quinta-feira, 8 de agosto de 2019 15:27
  • Deleted
    quinta-feira, 8 de agosto de 2019 15:50
  • SELECT
     FIN.ANOCOMP AS ANO,
     -- FIN.MESCOMP AS MES,
     FIN.CHAPA   AS CAPA,
     FUNC.NOME   AS NOME,
     FUNC.SECAO  AS COD_SECAO,
     FUNC.NSECAO AS NOME_SECAO,
     FUNC.FUNCAO AS COD_FUNCAO,
     FNCAO.NOME  AS NOME_FUNCAO, 
     SUM (CASE WHEN FIN.MESCOMP = 1  THEN FIN.HORA   END) AS [H_JAN],
     SUM (CASE WHEN FIN.MESCOMP = 1  THEN FIN.VALOR  END) AS [T_JAN],
     SUM (CASE WHEN FIN.MESCOMP = 2  THEN FIN.HORA   END) AS [H_FEV],
     SUM (CASE WHEN FIN.MESCOMP = 2  THEN FIN.VALOR  END) AS [T_FEV],
     SUM (CASE WHEN FIN.MESCOMP = 3  THEN FIN.HORA   END) AS [H_MAR],
     SUM (CASE WHEN FIN.MESCOMP = 3  THEN FIN.VALOR  END) AS [T_MAR],
     SUM (CASE WHEN FIN.MESCOMP = 4  THEN FIN.HORA   END) AS [H_ABR],
     SUM (CASE WHEN FIN.MESCOMP = 4  THEN FIN.VALOR  END) AS [T_ABR],
     SUM (CASE WHEN FIN.MESCOMP = 5  THEN FIN.HORA   END) AS [H_MAI],
     SUM (CASE WHEN FIN.MESCOMP = 5  THEN FIN.VALOR  END) AS [T_MAI],
     SUM (CASE WHEN FIN.MESCOMP = 6  THEN FIN.HORA   END) AS [H_JUN],
     SUM (CASE WHEN FIN.MESCOMP = 6  THEN FIN.VALOR  END) AS [T_JUN],
     SUM (CASE WHEN FIN.MESCOMP = 7  THEN FIN.HORA   END) AS [H_JUL],
     SUM (CASE WHEN FIN.MESCOMP = 7  THEN FIN.VALOR  END) AS [T_JUL],
     SUM (CASE WHEN FIN.MESCOMP = 8  THEN FIN.HORA   END) AS [H_AGO],
     SUM (CASE WHEN FIN.MESCOMP = 8  THEN FIN.VALOR  END) AS [T_AGO],
     SUM (CASE WHEN FIN.MESCOMP = 9  THEN FIN.HORA   END) AS [H_SET],
     SUM (CASE WHEN FIN.MESCOMP = 9  THEN FIN.VALOR  END) AS [T_SET],
     SUM (CASE WHEN FIN.MESCOMP = 10 THEN FIN.HORA   END) AS [H_OUT],
     SUM (CASE WHEN FIN.MESCOMP = 10 THEN FIN.VALOR  END) AS [T_OUT],
     SUM (CASE WHEN FIN.MESCOMP = 11 THEN FIN.HORA   END) AS [H_NOV],
     SUM (CASE WHEN FIN.MESCOMP = 11 THEN FIN.VALOR  END) AS [T_NOV],
     SUM (CASE WHEN FIN.MESCOMP = 12 THEN FIN.HORA   END) AS [H_DEZ],
     SUM (CASE WHEN FIN.MESCOMP = 12 THEN FIN.VALOR  END) AS [T_DEZ]
     	
    	FROM PFFINANC AS FIN (NOLOCK)
     
     INNER JOIN vwFUNC AS FUNC
     ON  FUNC.CHAPA    = FIN.CHAPA
     AND FUNC.COLIGADA = FIN.CODCOLIGADA
     
     INNER JOIN PFUNCAO AS FNCAO
     ON  FNCAO.CODIGO  = FUNC.FUNCAO
    	WHERE 
    	FIN.CODCOLIGADA   = 1
    	AND FIN.CODEVENTO = 185
    	AND FIN.CHAPA     = 0015
    	AND FIN.ANOCOMP   = 2018
    	GROUP BY 
    	FIN.ANOCOMP,FIN.MESCOMP,FIN.CHAPA,FIN.CHAPA,
    	FUNC.NOME,FUNC.NOME,FUNC.SECAO,FUNC.NSECAO,FUNC.FUNCAO,
    	FNCAO.NOME
    
    ORDER BY FUNC.NOME,FIN.ANOCOMP,FIN.MESCOMP;

    José Diz,

     Veja se entendi errado, pois ainda esta dando erro.

    Fiz como esta lá na documentação, e deu certo, mais porem, ainda exibe as 12 linhas dos meses,  mais com o paramento que fiz ai de consultas, teria que mostrar somente 1 linha.

    Estou entendendo que é porque o mes, esta lá no rodapé no group by, mais se eu tirar ele, da o seguinte erro:

    Mensagem 8127, Nível 16, Estado 1, Linha 53
    Column "PFFINANC.MESCOMP" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.
    

    Sabe me dizer como posso tratar esse erro ?

    quinta-feira, 8 de agosto de 2019 16:05
  • Deleted
    • Marcado como Resposta otaciojb quinta-feira, 8 de agosto de 2019 19:13
    quinta-feira, 8 de agosto de 2019 16:15
  • Perfeito, obrigado pela dica.
    quinta-feira, 8 de agosto de 2019 19:13
  • Também validado. Obrigado.
    quinta-feira, 8 de agosto de 2019 19:14