Como crear esta salida? Please!!!!!

25/11/2003 - 22:25 por Yo | Informe spam
Hola a todos!!!!!!!

Tengo los siguientes datos en una tabla:

ID1 ID2 Niv
01 0 1
02 01 2
03 01 2
04 02 3
05 02 3
06 01 2
07 06 3
08 07 4
09 01 2
10 01 2
11 0 1
12 11 2
13 12 3
14 11 2
15 14 3
16 11 2
17 11 2
18 17 3
19 17 3
20 18 4

Y necesito obtener la siguiente salida a una consulta
(Select o Procedimiento Almacenado con cursores)

Primero deben aparecer los registros con ID2 = 0,
ID1 es un identificador Unico, ID2 corresponde
un subnivel del registro que tiene el mismo valor
en ID1.

ID1 ID2 Niv
01 0 1
02 01 2
04 02 3
05 02 3
03 01 2
06 01 2
07 06 3
08 07 4
09 01 2
10 01 2
11 0 1
12 11 2
13 12 3
14 11 2
15 14 3
16 11 2
17 11 2
18 17 3
20 18 4
19 17 3

Cual seía el query que debo hacer para, a partir de los
datos obtener la salida mostrada??

Gracias.
Atte.
Yo.

Preguntas similare

Leer las respuestas

#1 Javier Loria
26/11/2003 - 00:15 | Informe spam
Hola:
Si la cantidad de niveles es conocida (en esta caso 4 niveles)
podrias hacer:
SELECT A1.ID1, A1.ID2,A1.Niv
FROM Arbol A1
LEFT JOIN Arbol A2
ON A1.ID2¢.ID1
LEFT JOIN Arbol A3
ON A2.ID2£.ID1
LEFT JOIN Arbol A4
ON A3.ID2¤.ID1
ORDER BY
LTRIM(COALESCE(A4.ID1,'')+COALESCE( A3.ID1,'')+COALESCE( A2.ID1,'')+A1.ID1)

Si la cantidad de niveles NO es conocida podrias hacer un CICLO llenar
una tabla temporal, no es necesario el cursor.
Si es algo que vas a hacer con frequencia y requieres "logica para
arboles", podrias revisar las estructuras de JOE CELKO para arboles. En
GOOGLE encuentas bastante documentacion eso si en Ingles.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Yo escribio:
Hola a todos!!!!!!!

Tengo los siguientes datos en una tabla:

ID1 ID2 Niv
01 0 1
02 01 2
03 01 2
04 02 3
05 02 3
06 01 2
07 06 3
08 07 4
09 01 2
10 01 2
11 0 1
12 11 2
13 12 3
14 11 2
15 14 3
16 11 2
17 11 2
18 17 3
19 17 3
20 18 4

Y necesito obtener la siguiente salida a una consulta
(Select o Procedimiento Almacenado con cursores)

Primero deben aparecer los registros con ID2 = 0,
ID1 es un identificador Unico, ID2 corresponde
un subnivel del registro que tiene el mismo valor
en ID1.

ID1 ID2 Niv
01 0 1
02 01 2
04 02 3
05 02 3
03 01 2
06 01 2
07 06 3
08 07 4
09 01 2
10 01 2
11 0 1
12 11 2
13 12 3
14 11 2
15 14 3
16 11 2
17 11 2
18 17 3
20 18 4
19 17 3

Cual seía el query que debo hacer para, a partir de los
datos obtener la salida mostrada??

Gracias.
Atte.
Yo.
Respuesta Responder a este mensaje
#2 Yo
26/11/2003 - 14:15 | Informe spam
Saludos y Gracias.

Pero me dió un error en la instrucción COALESCE, pero la
solucioné con un CONVERT.

Y Funcionó!!!!!!!!!!!!

Otro alcance, La cantidad de Niveles no es conocida.

Como lo Podría Hacer???

Gracias.
Atte.
Yo.


Hola:
Si la cantidad de niveles es conocida (en esta


caso 4 niveles)
podrias hacer:
SELECT A1.ID1, A1.ID2,A1.Niv
FROM Arbol A1
LEFT JOIN Arbol A2
ON A1.ID2¢.ID1
LEFT JOIN Arbol A3
ON A2.ID2£.ID1
LEFT JOIN Arbol A4
ON A3.ID2¤.ID1
ORDER BY
LTRIM(COALESCE(A4.ID1,'')+COALESCE( A3.ID1,'')+COALESCE(


A2.ID1,'')+A1.ID1)

Si la cantidad de niveles NO es conocida podrias


hacer un CICLO llenar
una tabla temporal, no es necesario el cursor.
Si es algo que vas a hacer con frequencia y


requieres "logica para
arboles", podrias revisar las estructuras de JOE CELKO


para arboles. En
GOOGLE encuentas bastante documentacion eso si en Ingles.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Yo escribio:
Hola a todos!!!!!!!

Tengo los siguientes datos en una tabla:

ID1 ID2 Niv
01 0 1
02 01 2
03 01 2
04 02 3
05 02 3
06 01 2
07 06 3
08 07 4
09 01 2
10 01 2
11 0 1
12 11 2
13 12 3
14 11 2
15 14 3
16 11 2
17 11 2
18 17 3
19 17 3
20 18 4

Y necesito obtener la siguiente salida a una consulta
(Select o Procedimiento Almacenado con cursores)

Primero deben aparecer los registros con ID2 = 0,
ID1 es un identificador Unico, ID2 corresponde
un subnivel del registro que tiene el mismo valor
en ID1.

ID1 ID2 Niv
01 0 1
02 01 2
04 02 3
05 02 3
03 01 2
06 01 2
07 06 3
08 07 4
09 01 2
10 01 2
11 0 1
12 11 2
13 12 3
14 11 2
15 14 3
16 11 2
17 11 2
18 17 3
20 18 4
19 17 3

Cual seía el query que debo hacer para, a partir de los
datos obtener la salida mostrada??

Gracias.
Atte.
Yo.




.

Respuesta Responder a este mensaje
#3 Javier Loria
26/11/2003 - 19:00 | Informe spam
Hola:
Umm, el COALESCE es un ISNULL con multiples parametros (ANSI), que
version de SQL corres?
En todo caso si la cantidad de niveles NO es conocida, podrias hacer:
DECLARE @MaxNivel INT
DECLARE @NivelActual INT
SET @NivelActual=1
SELECT @MaxNivel=MAX(Niv) FROM Arbol

/* Declara la Tabla Temporal */
DECLARE @Tabla Table (
[ID1] [char] (2) NOT NULL PRIMARY KEY,
[ID2] [char] (2),
[Niv] [int] NOT NULL
CHECK ([Niv] > 0),
Orden varchar(200) NOT NULL --Maximo 100 Niveles de Anidamiento.
)

/* Inserta la Raiz */
INSERT @Tabla(ID1, ID2, Niv, Orden)
SELECT ID1, ID2, Niv, ID1
FROM arbol
WHERE Niv=1

/* Ciclo de Inserciones */
WHILE (@NivelActual<@MaxNivel)
BEGIN
SET @NivelActual=@NivelActual+1
INSERT @Tabla(ID1, ID2, Niv, Orden)
SELECT Arbol.ID1,
Arbol.ID2,
Arbol.Niv,
T.Orden+Arbol.ID1
FROM Arbol
JOIN @Tabla AS T
ON Arbol.Id2=T.Id1
WHERE Arbol.Niv=@NivelActual
END

/* Devuelve el Resultado */
SELECT ID1, ID2, Niv
FROM @Tabla
ORDER BY Orden

Espero te sirva,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Yo escribio:
Saludos y Gracias.

Pero me dió un error en la instrucción COALESCE, pero la
solucioné con un CONVERT.

Y Funcionó!!!!!!!!!!!!

Otro alcance, La cantidad de Niveles no es conocida.

Como lo Podría Hacer???

Gracias.
Atte.
Yo.


Hola:
Si la cantidad de niveles es conocida (en esta caso 4 niveles)
podrias hacer:
SELECT A1.ID1, A1.ID2,A1.Niv
FROM Arbol A1
LEFT JOIN Arbol A2
ON A1.ID2¢.ID1
LEFT JOIN Arbol A3
ON A2.ID2£.ID1
LEFT JOIN Arbol A4
ON A3.ID2¤.ID1
ORDER BY
LTRIM(COALESCE(A4.ID1,'')+COALESCE( A3.ID1,'')+COALESCE(
A2.ID1,'')+A1.ID1)

Si la cantidad de niveles NO es conocida podrias hacer un CICLO
llenar una tabla temporal, no es necesario el cursor.
Si es algo que vas a hacer con frequencia y requieres "logica para
arboles", podrias revisar las estructuras de JOE CELKO para arboles.
En GOOGLE encuentas bastante documentacion eso si en Ingles.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Yo escribio:
Hola a todos!!!!!!!

Tengo los siguientes datos en una tabla:

ID1 ID2 Niv
01 0 1
02 01 2
03 01 2
04 02 3
05 02 3
06 01 2
07 06 3
08 07 4
09 01 2
10 01 2
11 0 1
12 11 2
13 12 3
14 11 2
15 14 3
16 11 2
17 11 2
18 17 3
19 17 3
20 18 4

Y necesito obtener la siguiente salida a una consulta
(Select o Procedimiento Almacenado con cursores)

Primero deben aparecer los registros con ID2 = 0,
ID1 es un identificador Unico, ID2 corresponde
un subnivel del registro que tiene el mismo valor
en ID1.

ID1 ID2 Niv
01 0 1
02 01 2
04 02 3
05 02 3
03 01 2
06 01 2
07 06 3
08 07 4
09 01 2
10 01 2
11 0 1
12 11 2
13 12 3
14 11 2
15 14 3
16 11 2
17 11 2
18 17 3
20 18 4
19 17 3

Cual seía el query que debo hacer para, a partir de los
datos obtener la salida mostrada??

Gracias.
Atte.
Yo.




.
Respuesta Responder a este mensaje
#4 Yo
27/11/2003 - 15:03 | Informe spam
Javier:

SQL Server 2000
Los Campos ID1 e ID2 son de tipo Numerico...

Gracias.
Atte.
Yo

Hola:
Umm, el COALESCE es un ISNULL con multiples


parametros (ANSI), que
version de SQL corres?
En todo caso si la cantidad de niveles NO es


conocida, podrias hacer:
DECLARE @MaxNivel INT
DECLARE @NivelActual INT
SET @NivelActual=1
SELECT @MaxNivel=MAX(Niv) FROM Arbol

/* Declara la Tabla Temporal */
DECLARE @Tabla Table (
[ID1] [char] (2) NOT NULL PRIMARY KEY,
[ID2] [char] (2),
[Niv] [int] NOT NULL
CHECK ([Niv] > 0),
Orden varchar(200) NOT NULL --Maximo 100 Niveles de


Anidamiento.
)

/* Inserta la Raiz */
INSERT @Tabla(ID1, ID2, Niv, Orden)
SELECT ID1, ID2, Niv, ID1
FROM arbol
WHERE Niv=1

/* Ciclo de Inserciones */
WHILE (@NivelActual<@MaxNivel)
BEGIN
SET @NivelActual=@NivelActual+1
INSERT @Tabla(ID1, ID2, Niv, Orden)
SELECT Arbol.ID1,
Arbol.ID2,
Arbol.Niv,
T.Orden+Arbol.ID1
FROM Arbol
JOIN @Tabla AS T
ON Arbol.Id2=T.Id1
WHERE Arbol.Niv=@NivelActual
END

/* Devuelve el Resultado */
SELECT ID1, ID2, Niv
FROM @Tabla
ORDER BY Orden

Espero te sirva,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Yo escribio:
Saludos y Gracias.

Pero me dió un error en la instrucción COALESCE, pero la
solucioné con un CONVERT.

Y Funcionó!!!!!!!!!!!!

Otro alcance, La cantidad de Niveles no es conocida.

Como lo Podría Hacer???

Gracias.
Atte.
Yo.


Hola:
Si la cantidad de niveles es conocida (en esta






caso 4 niveles)
podrias hacer:
SELECT A1.ID1, A1.ID2,A1.Niv
FROM Arbol A1
LEFT JOIN Arbol A2
ON A1.ID2¢.ID1
LEFT JOIN Arbol A3
ON A2.ID2£.ID1
LEFT JOIN Arbol A4
ON A3.ID2¤.ID1
ORDER BY
LTRIM(COALESCE(A4.ID1,'')+COALESCE( A3.ID1,'')+COALESCE






(
A2.ID1,'')+A1.ID1)

Si la cantidad de niveles NO es conocida podrias






hacer un CICLO
llenar una tabla temporal, no es necesario el cursor.
Si es algo que vas a hacer con frequencia y






requieres "logica para
arboles", podrias revisar las estructuras de JOE CELKO






para arboles.
En GOOGLE encuentas bastante documentacion eso si en






Ingles.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Yo escribio:
Hola a todos!!!!!!!

Tengo los siguientes datos en una tabla:

ID1 ID2 Niv
01 0 1
02 01 2
03 01 2
04 02 3
05 02 3
06 01 2
07 06 3
08 07 4
09 01 2
10 01 2
11 0 1
12 11 2
13 12 3
14 11 2
15 14 3
16 11 2
17 11 2
18 17 3
19 17 3
20 18 4

Y necesito obtener la siguiente salida a una consulta
(Select o Procedimiento Almacenado con cursores)

Primero deben aparecer los registros con ID2 = 0,
ID1 es un identificador Unico, ID2 corresponde
un subnivel del registro que tiene el mismo valor
en ID1.

ID1 ID2 Niv
01 0 1
02 01 2
04 02 3
05 02 3
03 01 2
06 01 2
07 06 3
08 07 4
09 01 2
10 01 2
11 0 1
12 11 2
13 12 3
14 11 2
15 14 3
16 11 2
17 11 2
18 17 3
20 18 4
19 17 3

Cual seía el query que debo hacer para, a partir de








los
datos obtener la salida mostrada??

Gracias.
Atte.
Yo.




.






.

Respuesta Responder a este mensaje
#5 Javier Loria
27/11/2003 - 19:23 | Informe spam
Hola:
En este caso tendrias que hacer los CONVERTS, eventualmente podrias
hacerlo con multiplicaciones pero no es muy elegante.
Voy a revisar los arboles de CELKO y te escribo luego.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Yo escribio:
Javier:

SQL Server 2000
Los Campos ID1 e ID2 son de tipo Numerico...

Gracias.
Atte.
Yo

Hola:
Umm, el COALESCE es un ISNULL con multiples parametros (ANSI), que
version de SQL corres?
En todo caso si la cantidad de niveles NO es conocida, podrias
hacer: DECLARE @MaxNivel INT
DECLARE @NivelActual INT
SET @NivelActual=1
SELECT @MaxNivel=MAX(Niv) FROM Arbol

/* Declara la Tabla Temporal */
DECLARE @Tabla Table (
[ID1] [char] (2) NOT NULL PRIMARY KEY,
[ID2] [char] (2),
[Niv] [int] NOT NULL
CHECK ([Niv] > 0),
Orden varchar(200) NOT NULL --Maximo 100 Niveles de Anidamiento.
)

/* Inserta la Raiz */
INSERT @Tabla(ID1, ID2, Niv, Orden)
SELECT ID1, ID2, Niv, ID1
FROM arbol
WHERE Niv=1

/* Ciclo de Inserciones */
WHILE (@NivelActual<@MaxNivel)
BEGIN
SET @NivelActual=@NivelActual+1
INSERT @Tabla(ID1, ID2, Niv, Orden)
SELECT Arbol.ID1,
Arbol.ID2,
Arbol.Niv,
T.Orden+Arbol.ID1
FROM Arbol
JOIN @Tabla AS T
ON Arbol.Id2=T.Id1
WHERE Arbol.Niv=@NivelActual
END

/* Devuelve el Resultado */
SELECT ID1, ID2, Niv
FROM @Tabla
ORDER BY Orden

Espero te sirva,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Yo escribio:
Saludos y Gracias.

Pero me dió un error en la instrucción COALESCE, pero la
solucioné con un CONVERT.

Y Funcionó!!!!!!!!!!!!

Otro alcance, La cantidad de Niveles no es conocida.

Como lo Podría Hacer???

Gracias.
Atte.
Yo.


Hola:
Si la cantidad de niveles es conocida (en esta caso 4
niveles) podrias hacer:
SELECT A1.ID1, A1.ID2,A1.Niv
FROM Arbol A1
LEFT JOIN Arbol A2
ON A1.ID2¢.ID1
LEFT JOIN Arbol A3
ON A2.ID2£.ID1
LEFT JOIN Arbol A4
ON A3.ID2¤.ID1
ORDER BY
LTRIM(COALESCE(A4.ID1,'')+COALESCE( A3.ID1,'')+COALESCE (
A2.ID1,'')+A1.ID1)

Si la cantidad de niveles NO es conocida podrias hacer un CICLO
llenar una tabla temporal, no es necesario el cursor.
Si es algo que vas a hacer con frequencia y requieres "logica
para arboles", podrias revisar las estructuras de JOE CELKO para
arboles. En GOOGLE encuentas bastante documentacion eso si en
Ingles. Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Yo escribio:
Hola a todos!!!!!!!

Tengo los siguientes datos en una tabla:

ID1 ID2 Niv
01 0 1
02 01 2
03 01 2
04 02 3
05 02 3
06 01 2
07 06 3
08 07 4
09 01 2
10 01 2
11 0 1
12 11 2
13 12 3
14 11 2
15 14 3
16 11 2
17 11 2
18 17 3
19 17 3
20 18 4

Y necesito obtener la siguiente salida a una consulta
(Select o Procedimiento Almacenado con cursores)

Primero deben aparecer los registros con ID2 = 0,
ID1 es un identificador Unico, ID2 corresponde
un subnivel del registro que tiene el mismo valor
en ID1.

ID1 ID2 Niv
01 0 1
02 01 2
04 02 3
05 02 3
03 01 2
06 01 2
07 06 3
08 07 4
09 01 2
10 01 2
11 0 1
12 11 2
13 12 3
14 11 2
15 14 3
16 11 2
17 11 2
18 17 3
20 18 4
19 17 3

Cual seía el query que debo hacer para, a partir de los
datos obtener la salida mostrada??

Gracias.
Atte.
Yo.




.






.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida