DÚVIDA - Utilizando max e trazendo uma coluna do tipo de dado TEXTO
Bom dia amigos,
ao executar:
SELECT
at.NUATENDIMENTO, at.NUITEM, MAX(NUSEQATIVIDADE)NUSEQATIVIDADE, CDTIPOATIVIDADE
FROM sac.ESACATIVIDADE at
WHERE
at.cdprojeto = 3
AND AT.CDTIPOATIVIDADE IN (301,302)
AND AT.DTCADASTRO >='2021-01-05'
GROUP BY at.NUATENDIMENTO, at.NUITEM,CDTIPOATIVIDADE
-- a query funciona perfeitamente.
Ao acrescentar um uma coluna que pode conter até 32000 caracteres, me retorna:
SELECT
at.NUATENDIMENTO, at.NUITEM, MAX(NUSEQATIVIDADE)NUSEQATIVIDADE, CDTIPOATIVIDADE,AT.DEATIVIDADE <--- Esta coluna -------
FROM sac.ESACATIVIDADE at
WHERE
at.cdprojeto = 3
AND AT.CDTIPOATIVIDADE IN (301,302)
AND AT.DTCADASTRO >='2021-01-05'
GROUP BY at.NUATENDIMENTO, at.NUITEM,CDTIPOATIVIDADE,AT.DEATIVIDADE <--------
Retorna:
SQL Error [42907]: Improper use of a string column, host variable, constant, or function "DEATIVIDADE".. SQLCODE=-134, SQLSTATE=42907, DRIVER=4.26.14
alguém poderia auxiliar?
ao executar:
SELECT
at.NUATENDIMENTO, at.NUITEM, MAX(NUSEQATIVIDADE)NUSEQATIVIDADE, CDTIPOATIVIDADE
FROM sac.ESACATIVIDADE at
WHERE
at.cdprojeto = 3
AND AT.CDTIPOATIVIDADE IN (301,302)
AND AT.DTCADASTRO >='2021-01-05'
GROUP BY at.NUATENDIMENTO, at.NUITEM,CDTIPOATIVIDADE
-- a query funciona perfeitamente.
Ao acrescentar um uma coluna que pode conter até 32000 caracteres, me retorna:
SELECT
at.NUATENDIMENTO, at.NUITEM, MAX(NUSEQATIVIDADE)NUSEQATIVIDADE, CDTIPOATIVIDADE,AT.DEATIVIDADE <--- Esta coluna -------
FROM sac.ESACATIVIDADE at
WHERE
at.cdprojeto = 3
AND AT.CDTIPOATIVIDADE IN (301,302)
AND AT.DTCADASTRO >='2021-01-05'
GROUP BY at.NUATENDIMENTO, at.NUITEM,CDTIPOATIVIDADE,AT.DEATIVIDADE <--------
Retorna:
SQL Error [42907]: Improper use of a string column, host variable, constant, or function "DEATIVIDADE".. SQLCODE=-134, SQLSTATE=42907, DRIVER=4.26.14
alguém poderia auxiliar?
Ogirdor
Curtidas 0
Melhor post
Emerson Nascimento
08/01/2021
teu banco é case sensitive? porque todas as referências a 'at' estão em minúsculas, exceto aquele junto ao campo DEATIVIDADE.
outra coisa: DEATIVIDADE é um campo LOB (CLOB, DBCLOB ou BLOB)? Se for, não é possível colocá-lo na group by ( https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/sqlref/src/tpc/db2z_lobrestrictions.html )
outra coisa: DEATIVIDADE é um campo LOB (CLOB, DBCLOB ou BLOB)? Se for, não é possível colocá-lo na group by ( https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/sqlref/src/tpc/db2z_lobrestrictions.html )
GOSTEI 1
Mais Respostas
Emerson Nascimento
08/01/2021
teu banco é case sensitive? porque todas as referências a 'at' estão em minúsculas, exceto aquele junto ao campo DEATIVIDADE.
outra coisa: DEATIVIDADE é um campo LOB (CLOB, DBCLOB ou BLOB)? Se for, não é possível colocá-lo na group by.
outra coisa: DEATIVIDADE é um campo LOB (CLOB, DBCLOB ou BLOB)? Se for, não é possível colocá-lo na group by.
GOSTEI 0
Ogirdor
08/01/2021
teu banco é case sensitive? porque todas as referências a 'at' estão em minúsculas, exceto aquele junto ao campo DEATIVIDADE.
outra coisa: DEATIVIDADE é um campo LOB (CLOB, DBCLOB ou BLOB)? Se for, não é possível colocá-lo na group by.
outra coisa: DEATIVIDADE é um campo LOB (CLOB, DBCLOB ou BLOB)? Se for, não é possível colocá-lo na group by.
Não é case sensitve.
N sei o tipo de dado exato do campo... acredito que seja LONGTEXT, o que até onde sei tambem impede o uso do group by.
alguma ideia de solução?
GOSTEI 0
Emerson Nascimento
08/01/2021
tente algo assim:
SELECT TAB.*, at.DEATIVIDADE FROM ( SELECT at.NUATENDIMENTO, at.NUITEM, MAX(at.NUSEQATIVIDADE) NUSEQATIVIDADE, at.CDTIPOATIVIDADE FROM sac.ESACATIVIDADE at WHERE at.cdprojeto = 3 AND at.CDTIPOATIVIDADE IN (301,302) AND at.DTCADASTRO >='2021-01-05' GROUP BY at.NUATENDIMENTO, at.NUITEM, at.CDTIPOATIVIDADE ) TAB INNER JOIN sac.ESACATIVIDADE at ON at.cdprojeto = 3 AND at.NUATENDIMENTO = TAB.NUATENDIMENTO AND at.NUITEM = TAB.NUITEM AND at.NUSEQATIVIDADE = TAB.NUSEQATIVIDADE AND at.CDTIPOATIVIDADE = TAB.CDTIPOATIVIDADE
GOSTEI 1
Ogirdor
08/01/2021
tente algo assim:
SELECT TAB.*, at.DEATIVIDADE FROM ( SELECT at.NUATENDIMENTO, at.NUITEM, MAX(at.NUSEQATIVIDADE) NUSEQATIVIDADE, at.CDTIPOATIVIDADE FROM sac.ESACATIVIDADE at WHERE at.cdprojeto = 3 AND at.CDTIPOATIVIDADE IN (301,302) AND at.DTCADASTRO >='2021-01-05' GROUP BY at.NUATENDIMENTO, at.NUITEM, at.CDTIPOATIVIDADE ) TAB INNER JOIN sac.ESACATIVIDADE at ON at.cdprojeto = 3 AND at.NUATENDIMENTO = TAB.NUATENDIMENTO AND at.NUITEM = TAB.NUITEM AND at.NUSEQATIVIDADE = TAB.NUSEQATIVIDADE AND at.CDTIPOATIVIDADE = TAB.CDTIPOATIVIDADE
Emerson... Deemais!
Funcionou perfeitamente, adaptei apenas para trazer ou CDTIPOATIVIDADE 301 ou CDTIPOATIVIDADE 302.
usaste uma logica beem diferente da minha, poderia comentar a query, explicando o q foi feito?
GOSTEI 0
Emerson Nascimento
08/01/2021
adaptei apenas para trazer ou CDTIPOATIVIDADE 301 ou CDTIPOATIVIDADE 302
Respondendo a tua pergunta...
o trecho abaixo é exatamente a primeira instrução que você mandou, já filtrando o cdTipoAtividade 301 e 302:
( SELECT at.NUATENDIMENTO, at.NUITEM, MAX(at.NUSEQATIVIDADE) NUSEQATIVIDADE, at.CDTIPOATIVIDADE FROM sac.ESACATIVIDADE at WHERE at.cdprojeto = 3 AND at.CDTIPOATIVIDADE IN (301,302) AND at.DTCADASTRO >='2021-01-05' GROUP BY at.NUATENDIMENTO, at.NUITEM, at.CDTIPOATIVIDADE ) TAB
Com o resultado, faço a junção com a própria tabela de atividades, utilizando no relacionamento os campos necessários para encontrar o que acredito ser a descrição da atividade (DEATIVIDADE).
Isto é feito no trecho abaixo:
INNER JOIN sac.ESACATIVIDADE at ON at.cdprojeto = 3 AND at.NUATENDIMENTO = TAB.NUATENDIMENTO AND at.NUITEM = TAB.NUITEM AND at.NUSEQATIVIDADE = TAB.NUSEQATIVIDADE AND at.CDTIPOATIVIDADE = TAB.CDTIPOATIVIDADE
Note que no primeiro trecho são filtrados os CDTIPOATIVIDADE 301 e 302, e no segundo eu faço o relacionamento utilizando o campo CDTIPOATIVIDADE, logo não seria necessário nenhuma adaptação.
GOSTEI 0