DÚVIDA - Utilizando max e trazendo uma coluna do tipo de dado TEXTO

SQL

Banco de Dados

DB2

08/01/2021

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?
Ogirdor

Ogirdor

Curtidas 0

Melhor post

Emerson Nascimento

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 )
GOSTEI 1

Mais Respostas

Emerson Nascimento

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.
GOSTEI 0
Ogirdor

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.


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

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

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

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
Serão apresentados os registros, agrupados por NUATENDIMENTO, NUITEM e CDTIPOATIVIDADE, trazendo ainda a maior sequencia (NUSEQATIVIDADE).
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
POSTAR