none
Ajuda com Query RRS feed

  • Pergunta

  • Pessoal, bom dia. 

    A partir de grande ajuda de vcs do fórum, cheguei muito perto do resultado que preciso para uma query. Porém, estou enfrentando dificuldades para fazer o que eu preciso para finaliza-la. Isso se for possível fazer o que eu necessito.

    Se puderem, conto com a ajuda de vcs :)

    Resultado obtido atualmente:

    O campo POSICAO, eu uso para ordenar. 
    Notem que para cada linha de cargo igual, um step diferente está preenchido. Por exemplo Analista Administrativo Junior, a primeira linha é preenchida a coluna Admissao, a segunda preenche a coluna I, e assim por diante

    O que eu gostaria de fazer é transformar todas as linhas de cargo igual em uma só. Somando a posição de todas. 

    As 4 linhas de Analista Administrativo Junior, por exemplo, ficariam assim:


    Segue query atual:

    SELECT
    POSICAO,        
    Cargo, 
    GRUPO,
    CASE WHEN [Admissao] IS NULL THEN 0 ELSE [Admissao] END AS [Admissao], 
    CASE WHEN [Sem Step] IS NULL THEN 0 ELSE [Sem Step] END AS [SemStep], 
    CASE WHEN [I] IS NULL THEN 0 ELSE [I] END AS [I], 
    CASE WHEN [II] IS NULL THEN 0 ELSE [II] END AS [II], 
    CASE WHEN [III] IS NULL THEN 0 ELSE [III] END AS [III]
    FROM            
    (SELECT 
    REPLACE(REPLACE(REPLACE(REPLACE(a.CARGO, ' III', ''), ' II', ''), ' I', ''), '*', '') AS Cargo, 
    a.POSICAO AS POSICAO, 
    a.GRUPO AS GRUPO,
    a.salario, 
    CASE WHEN a.CARGO NOT LIKE '%*' AND a.CARGO NOT LIKE '% I' AND a.CARGO NOT LIKE '% II' AND 
    a.CARGO NOT LIKE '% III' THEN 'Sem Step' WHEN a.CARGO LIKE '%*' THEN 'Admissao' ELSE REVERSE(SUBSTRING(REVERSE(a.CARGO), 0, CHARINDEX(' ', 
    REVERSE(a.CARGO)))) END AS Nivel
    FROM 
    GruposPorUnidade a) TAB1 
    PIVOT 
    (MAX(salario) FOR Nivel IN ([Admissao], [Sem Step], [I], [II], [III])
    ) PVT

    Obrigado a todos!


    Leonardo D'Amato


    sexta-feira, 20 de setembro de 2013 12:40

Respostas

  • Acho que seria algo do tipo.

    Não testei.

    SELECT
    SUM(POSICAO) AS POSICAO,
    Cargo,
    GRUPO,
    SUM(Admissao) AS Admissao,
    SUM(SemStep) AS SemStep,
    SUM(I) AS I,
    SUM(II) AS II,
    SUM(III) AS III
    FROM (
    SELECT
    POSICAO,        
    Cargo, 
    GRUPO,
    CASE WHEN [Admissao] IS NULL THEN 0 ELSE [Admissao] END AS [Admissao], 
    CASE WHEN [Sem Step] IS NULL THEN 0 ELSE [Sem Step] END AS [SemStep], 
    CASE WHEN [I] IS NULL THEN 0 ELSE [I] END AS [I], 
    CASE WHEN [II] IS NULL THEN 0 ELSE [II] END AS [II], 
    CASE WHEN [III] IS NULL THEN 0 ELSE [III] END AS [III]
    FROM            
    (SELECT 
    REPLACE(REPLACE(REPLACE(REPLACE(a.CARGO, ' III', ''), ' II', ''), ' I', ''), '*', '') AS Cargo, 
    a.POSICAO AS POSICAO, 
    a.GRUPO AS GRUPO,
    a.salario, 
    CASE WHEN a.CARGO NOT LIKE '%*' AND a.CARGO NOT LIKE '% I' AND a.CARGO NOT LIKE '% II' AND 
    a.CARGO NOT LIKE '% III' THEN 'Sem Step' WHEN a.CARGO LIKE '%*' THEN 'Admissao' ELSE REVERSE(SUBSTRING(REVERSE(a.CARGO), 0, CHARINDEX(' ', 
    REVERSE(a.CARGO)))) END AS Nivel
    FROM 
    GruposPorUnidade a) TAB1 
    PIVOT 
    (MAX(salario) FOR Nivel IN ([Admissao], [Sem Step], [I], [II], [III])
    ) PVT) AS Q
    GROUP BY Cargo, Grupo
    Abraço!

    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    sexta-feira, 20 de setembro de 2013 12:49

Todas as Respostas

  • Acho que seria algo do tipo.

    Não testei.

    SELECT
    SUM(POSICAO) AS POSICAO,
    Cargo,
    GRUPO,
    SUM(Admissao) AS Admissao,
    SUM(SemStep) AS SemStep,
    SUM(I) AS I,
    SUM(II) AS II,
    SUM(III) AS III
    FROM (
    SELECT
    POSICAO,        
    Cargo, 
    GRUPO,
    CASE WHEN [Admissao] IS NULL THEN 0 ELSE [Admissao] END AS [Admissao], 
    CASE WHEN [Sem Step] IS NULL THEN 0 ELSE [Sem Step] END AS [SemStep], 
    CASE WHEN [I] IS NULL THEN 0 ELSE [I] END AS [I], 
    CASE WHEN [II] IS NULL THEN 0 ELSE [II] END AS [II], 
    CASE WHEN [III] IS NULL THEN 0 ELSE [III] END AS [III]
    FROM            
    (SELECT 
    REPLACE(REPLACE(REPLACE(REPLACE(a.CARGO, ' III', ''), ' II', ''), ' I', ''), '*', '') AS Cargo, 
    a.POSICAO AS POSICAO, 
    a.GRUPO AS GRUPO,
    a.salario, 
    CASE WHEN a.CARGO NOT LIKE '%*' AND a.CARGO NOT LIKE '% I' AND a.CARGO NOT LIKE '% II' AND 
    a.CARGO NOT LIKE '% III' THEN 'Sem Step' WHEN a.CARGO LIKE '%*' THEN 'Admissao' ELSE REVERSE(SUBSTRING(REVERSE(a.CARGO), 0, CHARINDEX(' ', 
    REVERSE(a.CARGO)))) END AS Nivel
    FROM 
    GruposPorUnidade a) TAB1 
    PIVOT 
    (MAX(salario) FOR Nivel IN ([Admissao], [Sem Step], [I], [II], [III])
    ) PVT) AS Q
    GROUP BY Cargo, Grupo
    Abraço!

    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    sexta-feira, 20 de setembro de 2013 12:49
  • Ou... pode ser assim...

    usei CTE e depois agrupei os campos..

    ;WITH tab (POSICAO, Cargo, GRUPO, Admissao, SemStep, I,  II, III) AS
    (
    	SELECT
    		POSICAO,        
    		Cargo, 
    		GRUPO,
    		CASE WHEN [Admissao] IS NULL THEN 0 ELSE [Admissao] END AS [Admissao], 
    		CASE WHEN [Sem Step] IS NULL THEN 0 ELSE [Sem Step] END AS [SemStep], 
    		CASE WHEN [I] IS NULL THEN 0 ELSE [I] END AS [I], 
    		CASE WHEN [II] IS NULL THEN 0 ELSE [II] END AS [II], 
    		CASE WHEN [III] IS NULL THEN 0 ELSE [III] END AS [III]
    	FROM            
    	(
    		SELECT 
    			REPLACE(REPLACE(REPLACE(REPLACE(a.CARGO, ' III', ''), ' II', ''), ' I', ''), '*', '') AS Cargo, 
    			a.POSICAO AS POSICAO, 
    			a.GRUPO AS GRUPO,
    			a.salario, 
    			CASE WHEN a.CARGO NOT LIKE '%*' AND a.CARGO NOT LIKE '% I' AND a.CARGO NOT LIKE '% II' AND 
    			a.CARGO NOT LIKE '% III' THEN 'Sem Step' WHEN a.CARGO LIKE '%*' THEN 'Admissao' ELSE REVERSE(SUBSTRING(REVERSE(a.CARGO), 0, CHARINDEX(' ', 
    			REVERSE(a.CARGO)))) END AS Nivel
    		FROM 
    			GruposPorUnidade a) TAB1 
    	PIVOT 
    	(MAX(salario) FOR Nivel IN ([Admissao], [Sem Step], [I], [II], [III])
    	) PVT
    )
    
    SELECT 
    	MAX(POSICAO) as POSICAO,        
    	Cargo, 
    	GRUPO,
    	SUM(Admissao) as Admissao,
    	SUM(SemStep) as SemStep,
    	SUM(I) as I, 
    	SUM(II) as II, 
    	SUM(III) as III
    FROM tab
    GROUP BY 
    	Cargo, 
    	GRUPO


    "Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta."

    Érica Tohoma | http://bloggirlsa.wordpress.com

    sexta-feira, 20 de setembro de 2013 13:28