Boa tarde galera, estou montando um SQL para saber a media de atendimentos por hora dos funcionários da empresa. porem chega a um ponto que depende como uso da dois erros diferentes:


SQL:
SELECT FUNCIONARIO, (QTDEHORAS/QTDE) AS MEDIA
FROM
(
SELECT no_funcionario as FUNCIONARIO,
    case when (HORA/3600) < 10 then '0'||(HORA/3600) else (HORA/3600) end ||'.'||
    CASE when ((HORA-((HORA)/3600)*3600)/60) < 10 then
'0'||((HORA-((HORA)/3600)*3600)/60) else
((HORA-((HORA)/3600)*3600)/60) end as QTDEHORAS, QTDE
FROM
(
SELECT
    CAST(SUM(
        EXTRACT( HOUR FROM o.hor_total ) * 3600 +
        EXTRACT( MINUTE FROM o.hor_total ) * 60 +
        EXTRACT( SECOND FROM o.hor_total )
    ) AS INTEGER) AS HORA, o.no_funcionario, count(*) as QTDE
FROM OS o
where o.data = '19.02.2015'
group by o.no_funcionario
)
)

Quando rodo ele assim da o seguinte erro:
"Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements.
Dynamic SQL Error.
expression evaluation not supported."

2º - Adiciono a cláusula GROUP BY
SQL:
SELECT FUNCIONARIO, (QTDEHORAS/QTDE) AS MEDIA
FROM
(
SELECT no_funcionario as FUNCIONARIO,
    case when (HORA/3600) < 10 then '0'||(HORA/3600) else (HORA/3600) end ||'.'||
    CASE when ((HORA-((HORA)/3600)*3600)/60) < 10 then
'0'||((HORA-((HORA)/3600)*3600)/60) else
((HORA-((HORA)/3600)*3600)/60) end as QTDEHORAS, QTDE
FROM
(
SELECT
    CAST(SUM(
        EXTRACT( HOUR FROM o.hor_total ) * 3600 +
        EXTRACT( MINUTE FROM o.hor_total ) * 60 +
        EXTRACT( SECOND FROM o.hor_total )
    ) AS INTEGER) AS HORA, o.no_funcionario, count(*) as QTDE
FROM OS o
where o.data = '19.02.2015'
group by o.no_funcionario
)
)
group by funcionario

Quando executado assim acontece o seguinte erro:
"Invalid token.
Dynamic SQL Error.
SQL error code = -104.
user name required."

Alguém sabe onde esta o erro ou o que esta faltando ?
Ari Junior

Ari Junior

Responder

Posts

19/02/2015

Renato Rubinho

Buenas,

O primeiro comando é o mais correto.
Não tem necessidade do group by do segundo porque você não está mais agrupando os registros.
Acho que o erro está dentro do case when porque está tentando concatenar texto com número

Não entendi sua lógica da divisão pelos 3600 segundos validar se é maior que 10, daí para frente ficou difícil ajudar a corrigir o comando em sí, mas usando sua lógica, veja se isso ajuda:

Exemplo:>>> '0'||(HORA/3600)

ou é '0'|| CAST(HORA/3600 AS VARCHAR(10)) // RETORNANDO O TEXTO
ou é 0 + (HORA/3600) // RETORNANDO O NUMERO
[/code]

Veja se isso ajuda.

Abraççç
Responder

20/02/2015

Ari Junior

Obrigado Bruninho,

Consegui resolver de uma outra maneira já, obrigado pela resposta.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar