Jump to content
cfsardinha

Calculando positivos e negativos da soma total

Recommended Posts

Bom dia, pessoal.

Sou nova aqui no fórum e estou necessitando de uma grande ajuda.

Tenho uma sentença SQL (banco Oracle) que calcula o saldo de horas extras de cada funcionário. Nela mostra se o funcionário está com horas positivas ou negativas. A questão é que agora pediram para fazer esse cálculo por setor e não por funcionário. Ou seja, preciso somar todos os funcionários do setor e fazer um totalzão das horas positivas e outro das horas negativas do setor.

Busquei aqui no fórum e o mais próximo que achei foi esse tópico fechado aqui:

https://forum.imasters.com.br/topic/496657-calculando-positivos-e-negativos-da-soma-total/

Nesse tópico sugeria criar a linha abaixo usando a query como uma tabela virtual:

SELECT (CASE WHEN total < 0 THEN valor ELSE 0 END) negativo,
       (CASE WHEN total >= 0 THEN valor ELSE 0 END) positivo
FROM

No entanto, quando fui tentar adaptar para a minha sentença SQL, não funcionou. 

Não sou especialista em SQL e não sei se fiz algo de errado ou se o caso desse tópico em questão não seria a solução para o meu caso.

A minha sentença atual é essa abaixo (não fui eu quem fez). Agradeço qualquer ajuda para essa pessoa leiga em SQL.

 

 SELECT DISTINCT
Y.* ,
TRUNC((trunc(VALOR_HORA * 1.5,2)) *(TO_NUMBER(SUBSTR(HORAS, 0, INSTR(HORAS,
':')-1)) + TRUNC(TO_NUMBER(SUBSTR(HORAS, INSTR(HORAS, ':')+1, 99)) /60,2)),2)
AS SOMA_MAIS_50PORCENTO
FROM
(
        SELECT 
                X.CODCOLIGADA,
                X.CHAPA,
                X.NOME,
                X.NOMEFANTASIA,
                X.CODSECAO,
                X.DESCRICAO, 
                X.FUNCAO,
        ROUND(SALARIO, 2) AS VALOR_HORA,
        TO_CHAR(TRUNC((HORAS * 60) / 3600), 'FM9900') || ':' || TO_CHAR(TRUNC
(MOD((MINUTOS * 60), 3600) / 60), 'FM00') AS HORAS
        FROM ( 
                SELECT  
                        A.CODCOLIGADA,
                        A.CHAPA,
                        B.NOME,
                        C.NOMEFANTASIA,
                        B.CODSECAO,
                        D.DESCRICAO,
                        E.NOME AS FUNCAO,
                        B.SALARIO / B.JORNADAMENSAL * 60  AS SALARIO,
                        B.SALARIO SALARIO_ORIGINAL,
                        B.JORNADAMENSAL,
                        CASE WHEN
                        CAST(((SUM
(((EXTRAFAIXA1+EXTRAFAIXA2+EXTRAFAIXA3+EXTRAFAIXA4+EXTRAFAIXA5)+(EXTRADESC1+EX
TRADESC2)+(EXTRAFER1+EXTRAFER2)+(EXTRACOMP1+EXTRACOMP2)))-
                        SUM(FALTA+ATRASO))) AS DECIMAL(18,2)) >=0 THEN 
                        CAST(((SUM
(((EXTRAFAIXA1+EXTRAFAIXA2+EXTRAFAIXA3+EXTRAFAIXA4+EXTRAFAIXA5)+(EXTRADESC1+EX
TRADESC2)+(EXTRAFER1+EXTRAFER2)+(EXTRACOMP1+EXTRACOMP2)))-
                        SUM(FALTA+ATRASO))) AS DECIMAL(18,2)) ELSE
                        -CAST(((SUM
(((EXTRAFAIXA1+EXTRAFAIXA2+EXTRAFAIXA3+EXTRAFAIXA4+EXTRAFAIXA5)+(EXTRADESC1+EX
TRADESC2)+(EXTRAFER1+EXTRAFER2)+(EXTRACOMP1+EXTRACOMP2)))-
                        SUM(FALTA+ATRASO))) AS DECIMAL(18,2))
                        END AS MINUTOS,
                        CAST(((SUM
(((EXTRAFAIXA1+EXTRAFAIXA2+EXTRAFAIXA3+EXTRAFAIXA4+EXTRAFAIXA5)+(EXTRADESC1+EX
TRADESC2)+(EXTRAFER1+EXTRAFER2)+(EXTRACOMP1+EXTRACOMP2)))-
                        SUM(FALTA+ATRASO))) AS DECIMAL(18,0)) AS HORAS
                FROM ABANCOHORFUN A 
                LEFT OUTER JOIN PFUNC B ON A.CODCOLIGADA=B.CODCOLIGADA AND
A.CHAPA=B.CHAPA 
                LEFT OUTER JOIN GFILIAL C ON B.CODCOLIGADA=C.CODCOLIGADA AND
B.CODFILIAL=C.CODFILIAL
                LEFT OUTER JOIN PSECAO D ON B.CODCOLIGADA=D.CODCOLIGADA AND
B.CODSECAO=D.CODIGO
                LEFT OUTER JOIN PFUNCAO E ON E.CODCOLIGADA = B.CODCOLIGADA AND
E.CODIGO = B.CODFUNCAO 
                WHERE B.CODSITUACAO<>'D' 
                              AND A.DATA >= :PLN_C3_D
AND A.DATA <= :PLN_C4_D
AND A.CODCOLIGADA = :PLN_C2_N
                
                GROUP BY  A.CODCOLIGADA,
                                    A.CHAPA,
                                    B.NOME,
                                    C.NOMEFANTASIA,
                                    B.CODSECAO,
                                    D.DESCRICAO,
                                    E.NOME,
                                    B.SALARIO / B.JORNADAMENSAL,
                                    B.SALARIO,
                                    B.JORNADAMENSAL
                ) X
        ) Y


ORDER BY 5,10
 

Share this post


Link to post
Share on other sites
Citar

A questão é que agora pediram para fazer esse cálculo por setor e não por funcionário

 

é um GROUP BY em tese suprimir os dados de funcionário e deixar (ou inserir) os de Setor deve resolver

 

tente :

 

 

SELECT DISTINCT
Y.* ,
TRUNC((trunc(VALOR_HORA * 1.5,2)) *(TO_NUMBER(SUBSTR(HORAS, 0, INSTR(HORAS,
':')-1)) + TRUNC(TO_NUMBER(SUBSTR(HORAS, INSTR(HORAS, ':')+1, 99)) /60,2)),2)
AS SOMA_MAIS_50PORCENTO
FROM
(
        SELECT 
                X.CODCOLIGADA,
                X.CHAPA,
                X.NOME,
                X.NOMEFANTASIA,
                X.CODSECAO,
                X.DESCRICAO, 
                X.FUNCAO,
        ROUND(SALARIO, 2) AS VALOR_HORA,
        TO_CHAR(TRUNC((HORAS * 60) / 3600), 'FM9900') || ':' || TO_CHAR(TRUNC
(MOD((MINUTOS * 60), 3600) / 60), 'FM00') AS HORAS
        FROM ( 
                SELECT  
                        A.CODCOLIGADA,
                        A.CHAPA,
                        -- suprimido B.NOME,
                        C.NOMEFANTASIA,
                        B.CODSECAO,
                        D.DESCRICAO,
                        E.NOME AS FUNCAO,
                        B.SALARIO / B.JORNADAMENSAL * 60  AS SALARIO,
                        B.SALARIO SALARIO_ORIGINAL,
                        B.JORNADAMENSAL,
                        CASE WHEN
                        CAST(((SUM
(((EXTRAFAIXA1+EXTRAFAIXA2+EXTRAFAIXA3+EXTRAFAIXA4+EXTRAFAIXA5)+(EXTRADESC1+EX
TRADESC2)+(EXTRAFER1+EXTRAFER2)+(EXTRACOMP1+EXTRACOMP2)))-
                        SUM(FALTA+ATRASO))) AS DECIMAL(18,2)) >=0 THEN 
                        CAST(((SUM
(((EXTRAFAIXA1+EXTRAFAIXA2+EXTRAFAIXA3+EXTRAFAIXA4+EXTRAFAIXA5)+(EXTRADESC1+EX
TRADESC2)+(EXTRAFER1+EXTRAFER2)+(EXTRACOMP1+EXTRACOMP2)))-
                        SUM(FALTA+ATRASO))) AS DECIMAL(18,2)) ELSE
                        -CAST(((SUM
(((EXTRAFAIXA1+EXTRAFAIXA2+EXTRAFAIXA3+EXTRAFAIXA4+EXTRAFAIXA5)+(EXTRADESC1+EX
TRADESC2)+(EXTRAFER1+EXTRAFER2)+(EXTRACOMP1+EXTRACOMP2)))-
                        SUM(FALTA+ATRASO))) AS DECIMAL(18,2))
                        END AS MINUTOS,
                        CAST(((SUM
(((EXTRAFAIXA1+EXTRAFAIXA2+EXTRAFAIXA3+EXTRAFAIXA4+EXTRAFAIXA5)+(EXTRADESC1+EX
TRADESC2)+(EXTRAFER1+EXTRAFER2)+(EXTRACOMP1+EXTRACOMP2)))-
                        SUM(FALTA+ATRASO))) AS DECIMAL(18,0)) AS HORAS
                FROM ABANCOHORFUN A 
                LEFT OUTER JOIN PFUNC B ON A.CODCOLIGADA=B.CODCOLIGADA AND
A.CHAPA=B.CHAPA 
                LEFT OUTER JOIN GFILIAL C ON B.CODCOLIGADA=C.CODCOLIGADA AND
B.CODFILIAL=C.CODFILIAL
                LEFT OUTER JOIN PSECAO D ON B.CODCOLIGADA=D.CODCOLIGADA AND
B.CODSECAO=D.CODIGO
                LEFT OUTER JOIN PFUNCAO E ON E.CODCOLIGADA = B.CODCOLIGADA AND
E.CODIGO = B.CODFUNCAO 
                WHERE B.CODSITUACAO<>'D' 
                              AND A.DATA >= :PLN_C3_D
AND A.DATA <= :PLN_C4_D
AND A.CODCOLIGADA = :PLN_C2_N
                
                GROUP BY  A.CODCOLIGADA,
                                    A.CHAPA,
                                    -- suprimido B.NOME,
                                    C.NOMEFANTASIA,
                                    B.CODSECAO,
                                    D.DESCRICAO,
                                    E.NOME,
                                    B.SALARIO / B.JORNADAMENSAL,
                                    B.SALARIO,
                                    B.JORNADAMENSAL
                ) X
        ) Y


ORDER BY 5,10

Share this post


Link to post
Share on other sites

Ok, eu suprimi os dados de funcionário e deixei os de Setor , mas ainda preciso fazer a soma dos funcionários por seção, resultando numa única resposta por seção, entende?

 

Veja esse exemplo:

COLI
GADA - NOME FANTASIA               - SEÇÃO              - DESCRIÇÃO DA SEÇÃO -      FUNÇÃO -                    VALOR HORA - HORAS - SOMA MAIS 50%

1    CLINICA PERINATAL LARANJEIRAS    001.001.001.006    Central de Agendamentos    APRENDIZ DE SERV. ADMI.        5,81    00:48      6,96
1    CLINICA PERINATAL LARANJEIRAS    001.001.001.006    Central de Agendamentos    OPERADOR DE TELEATENDIMENTO    8,35    -02:59    -12,77
1    CLINICA PERINATAL LARANJEIRAS    001.001.001.006    Central de Agendamentos    OPERADOR DE TELEATENDIMENTO    7,36    -08:07    -87,1
1    CLINICA PERINATAL LARANJEIRAS    001.001.001.006    Central de Agendamentos    OPERADOR DE TELEATENDIMENTO    7,23    00:38      6,82
1    CLINICA PERINATAL LARANJEIRAS    001.001.001.006    Central de Agendamentos    LÍDER DE TELEATENDIMENTO       7,49    00:39      7,29
1    CLINICA PERINATAL LARANJEIRAS    001.001.001.006    Central de Agendamentos    LÍDER DE TELEATENDIMENTO       6,27    04:35      43,05
1    CLINICA PERINATAL LARANJEIRAS    001.001.001.006    Central de Agendamentos    AUX. ADMINIST.                 6,27    00:16      2,44

 

 

Preciso somar todas as funções da seção para gerar um totalzão das colunas "valor hora" e "soma com 50%", entende? Saberia me ajudar?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By marcos antonio duarte
      como faço para trazer uma soma dessa linha de comando:
       round(vlr.pre_pro_valor * sum(loc.loc_area) over (partition by lnc.id_recur_lanc,loc.loc_area  ) / sum(loc.loc_area) over (partition by lnc.id_recur_lanc) * ins.insum_qtde,3)  as Gasto_total,
       
    • By marcos antonio duarte
      eu tenho uma query que tem muitos relacionamentos where, porem tem um dado que preciso buscar que só virá usando uma left join, porem não sou familiarizado com essa função left join preciso de uma ajudinha.
       
       
    • By marcos antonio duarte
      Tenha uma tabela com dados de codigo de produto (number), produto (char) ,data de entrada do ultimo valor do produto formato (date) e valor do produto (number[9,4] e ), como faço para trazer o campo valor do produto referente a ultima data de valor?
       
      cod_produto |      produto        | data entrada   |   valor  
      1                            arroz              01/01/2017     |   5,80
      1                            arroz              03/01/2017     |   6,10
      2                            feijao             05/02/2017     |   8,00
      3                            macarrão      01/01/2017     |   2,5
      3                            macarrão      15/01/2017     |   2,8
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.