No artigo de hoje, vou demonstrar como selecionar informações em uma coluna de query usando FOR XML PATH.
Recentemente um aluno me perguntou, se tinha como ele conferir os valores que estavam agrupados de uma query, analisando quais dados que estavam entrando dentro do agrupamento.
Para fazer isso, nós devemos utilizar o conceito do FOR XML PATH, onde basicamente nós selecionamos várias linhas, que se transformam em uma única linha de informação.
Então, apenas para exemplificar no nosso exemplo, a lógica seria assim:
- Primeiro fazemos a query buscando todos os grupos de produto (SBM)
- Depois adicionamos um join com os produtos (SB1)
- Após fazer a junção, nós agrupamos por grupo, e mostramos quantos produtos existem (COUNT)
- Por último, adicionamos uma subquery buscando os Recnos dos Produtos, com o mesmo filtro usado no join (SELECT com FOR XML PATH). No nosso caso, nós selecionamos até 800 caracteres, mas você pode aumentar esse limite
Obs.: No passo 4, você pode usar outros campos ao invés do Recno se achar mais fácil, como por exemplo, código do produto
Abaixo um print de resultado da query:
E abaixo a query SQL:
SELECT
BM_GRUPO,
BM_DESC,
COUNT(B1_COD) AS QTD_PRODS,
ISNULL(
CONVERT(VARCHAR(800),
(
SELECT
CONVERT(VARCHAR, SB1B.R_E_C_N_O_) + ', '
FROM
SB1990 SB1B
WHERE
SB1B.B1_FILIAL = ''
AND SB1B.B1_GRUPO = SBM.BM_GRUPO
AND SB1B.D_E_L_E_T_ = ''
ORDER BY
SB1B.R_E_C_N_O_
FOR XML PATH ('')
)
),
'') AS LIST_REC
FROM
SBM990 SBM
LEFT JOIN SB1990 SB1 ON (
B1_FILIAL = ''
AND B1_GRUPO = BM_GRUPO
AND SB1.D_E_L_E_T_ = ' '
)
WHERE
BM_FILIAL = '01'
AND SBM.D_E_L_E_T_ = ' '
GROUP BY
BM_GRUPO,
BM_DESC
ORDER BY
QTD_PRODS DESC
Bom pessoal, por hoje é só.
Abraços e até a próxima.

Parabéns Daniel, por compartilhar esta dica valiosa!!
Eu que agradeço pelo comentário e feedback jovem.
Grande abraço.
Bom dia Daniel,
Acompanho sempre suas dicas e como o parceiro aí disse, são sempre valiosas…
Esta função é válida para o BD SQL Server? Você sabe me dizer se no Oracle tem algo compatível?
Obrigado
Bom dia Walter, tudo bem?
Primeiramente obrigado pelo feedback.
No caso o FOR XML PATH é um recurso nativo do SQL Server, para Oracle eu nunca precisei, mas pesquisando aqui no Stack Overflow, parece que o recurso similar que existe é o LISTAGG, o link que encontrei foi esse – https://stackoverflow.com/questions/44941304/converting-mssql-for-xml-path-to-oracle .
Espero ter ajudado.
Grande abraço.