Consulta com recursividade (treeview)

Como realizar uma consulta que exiba um relacionamento unário (recursividade)?
Exemplo: Um tabela de categoria com ID, ID_PAI Nome e Descrição. Ou seja, um registro pode ter um autorelacionamento com a própria tabela. Ilustração: São Paulo tem no seu ID_PAI o registro de Brazil e Brazil tem em seu ID_PAI América Latina, etc…

Este caso é bem normal no desenvolvimento de sistemas no caso de “categorias”. Como eu posso criar uma consulta assim? É possível? Quando eu crio uma consulta simples e coloco quebra, eu posso quebrar em outro campo apenas e não no mesmo que já foi quebrado.

Sugestões? Eu acredito que não tenha como, mas alguém pode ter desenvolvido de outra forma.

Como vc quer quebrar este exemplo seu?

Abaixo o exemplo prático (apenas um exemplo que criei para demonstrar)

A totalização pouco importa porque eu posso fazer via SQL! A preocupação é a quebra (identação) da estrutura de categorias. Este recurso é muito importante!

Se utilizar uma consulta simples, não há identação e agrupamento (treeview), o que dificulta a visualição, filtro, gráficos e sumário! Se quebrar por categoria (região), não adianta porque o scriptcase não tem opção de quebrar em recursividade (pelo menos que eu saiba fazer).

Agradeço muito se me der uma solução! Acho que a comunidade e a ferramenta cresce!

Obrigado!

Ja teve solução?

um amigo me passou uma consulta desse jeito funciona no mssql

WITH CPU_AD (CODCOLIGADA, IDPRJ, IDCMP, IDCMPFILHA, IDISM, CODCMP, DESCCMP, COEF, VALORUNIT, VALORTOTAL, VALORFLOAT, VALORUNIT2, GRUPODNER2, NIVEL)
AS
(
–Anchor Member ,

	SELECT	MRECCMP.CODCOLIGADA, MRECCMP.IDPRJ, MRECCMP.IDCMP, MRECCMP.IDCMPFILHA, MRECCMP.IDISM, MCMP.CODCMP, MCMP.DESCCMP,  
			(MRECCMP.QUANTIDADE/10000)	AS COEF, MRECCMP.VALORUNIT, MRECCMP.VALORTOTAL, MPARAMETRO.VALORFLOAT, 
			(MRECCMP.VALORTOTAL/MPARAMETRO.VALORFLOAT) AS VALORUNIT2, MGIS.GRUPODNER, 0 AS NIVEL
	FROM MCMP 
				INNER JOIN	MRECCMP ON (
							MRECCMP.CODCOLIGADA		=	MCMP.CODCOLIGADA 
						AND MRECCMP.IDPRJ			=	MCMP.IDPRJ 
						AND MRECCMP.IDCMP			=	MCMP.IDCMP)
				INNER JOIN  MPARAMETRO	ON (
							MPARAMETRO.CODCOLIGADA	=	MCMP.CODCOLIGADA 
						AND MPARAMETRO.IDPRJ		=	MCMP.IDPRJ )		
				LEFT JOIN	MISM ON (
							MRECCMP.CODCOLIGADA	=	MISM.CODCOLIGADA 
						AND MRECCMP.IDPRJ		=	MISM.IDPRJ 
						AND MRECCMP.IDISM		=	MISM.IDISM)
				LEFT JOIN  MGIS ON (
							MGIS.CODCOLIGADA	=	MISM.CODCOLIGADA 
						AND MGIS.IDPRJ			=	MISM.IDPRJ 
						AND MGIS.IDGIS			=	MISM.IDGIS)																											
	WHERE 
			MCMP.CODCOLIGADA		= 1
		AND MCMP.IDPRJ				= 102 
		AND MCMP.IDCMP				= 252914  
		AND MPARAMETRO.PARAMETRO	= 'FATORLEISOCIAL1'
	UNION ALL
	
	--Recursive Member
	SELECT MRECCMP.CODCOLIGADA, MRECCMP.IDPRJ, MRECCMP.IDCMP, MRECCMP.IDCMPFILHA, MRECCMP.IDISM, MCMP.CODCMP, MCMP.DESCCMP, 
	(MRECCMP.QUANTIDADE/10000)	AS COEF,  MRECCMP.VALORUNIT, MRECCMP.VALORTOTAL, MPARAMETRO.VALORFLOAT, 
	(MRECCMP.VALORTOTAL/MPARAMETRO.VALORFLOAT) AS VALORUNIT2, GRUPODNER, NIVEL + 1 
		FROM MCMP 
				INNER JOIN	MRECCMP ON (
							MRECCMP.CODCOLIGADA	=	MCMP.CODCOLIGADA 
						AND MRECCMP.IDPRJ		=	MCMP.IDPRJ 
						AND MRECCMP.IDCMP		=	MCMP.IDCMP)
				INNER JOIN MPARAMETRO	ON (
							MPARAMETRO.CODCOLIGADA	=	MCMP.CODCOLIGADA 
						AND MPARAMETRO.IDPRJ		=	MCMP.IDPRJ )	
														

				INNER JOIN	CPU_AD AS D ON (
							D.CODCOLIGADA	=	MCMP.CODCOLIGADA 
						AND D.IDPRJ			=	MCMP.IDPRJ 
						AND D.IDCMPFILHA	=	MCMP.IDCMP)	
							

	WHERE 
			MCMP.CODCOLIGADA		= 1
		AND MCMP.IDPRJ				= 102 
		AND MPARAMETRO.PARAMETRO	= 'FATORLEISOCIAL1'

)

SELECT * FROM CPU_AD AS D

amigos,

Utilizo este tipo de estrutura para Unidade/setores/departamentos onde monto a hierarquia da empresa do cliente

ID_unid  inteiro
Nome_da_Unidade  texto
Hierarquia  texto
ID_Unid_Superior inteiro


exemplo:

ID_unid   Nome_da_Unidade  Hierarquia  ID_Unid_Superior 
   1           PRESIDENCIA            1                   1
   2           DIR. TECNICA            1.2                2
   3           DIR. FINANCEIRA       1.3                1
   4           DEPTO ANALISE         1.2.4             2

Utilize a Hierarquia par fazer a identação

Espero ter ajudado !

Abraços !