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

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

Aceitar