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.