Erros SQL -

SQL Server

MySQL

Delphi

Automação Comercial

SQLite

Firebird

19/02/2015

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

Curtidas 0

Respostas

Renato Rubinho

Renato Rubinho

19/02/2015

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ççç
GOSTEI 0
Ari Junior

Ari Junior

19/02/2015

Obrigado Bruninho,

Consegui resolver de uma outra maneira já, obrigado pela resposta.
GOSTEI 0
POSTAR