SQL Server - Consulta anidada

   
Vista:

Consulta anidada

Publicado por Fernando (2 intervenciones) el 09/12/2014 11:35:58
Primero que nada quiero saludar a todos y presentarme ya que soy nuevo en el foro. Yo no soy programador habitual, pero si que tengo que meterle mano de vez en cuando, por lo que les ruego me disculpen si la pregunta es una chorrada, pero llevo ya unos días y no consigo meterla a camino.

Tengo una tabla en SQLServer 2000 SP1 con una estructura similar a:

Línea [int]
Trayecto [int]
Orden [int]
Parada [int]

Y quiero obtener un listado con las paradas de una línea y sus correspondencias, o sea, algo así como esto:

Línea___ Trayecto_ Orden Parada_ Correspondencias
======= ======== ===== ====== ==================
1 ______ 1 _______ 1 ___ 1001 ___ 3, 5, 7, 15
1 ______ 1 _______ 2 ___ 1002 ___ 5, 9
1 ______ 1 _______ 3 ___ 3014 ___ 6, 8
1 ______ 1 _______ 4 ___ 3566
...
1 ______ 2 _______ 12 ___ 5214 ___ 6, 8
1 ______ 2 _______ 13 ___ 6502 ___ 5, 9
1 ______ 2 _______ 14 ___ 6501 ___ 3, 5, 7, 15
...
3 ______ 7 _______ 12 __ 1001 ___ 1, 5, 7, 15
...
3 ______ 8 _______ 4 ___ 6501 ___ 1, 5, 7, 15
...
5 ______ 1 _______ 8 ___ 1001 ___ 1, 3, 7, 15
...
5 ______ 1 _______ 19 ___ 6501 ___ 1, 3, 7, 15
...
5 ______ 1 _______ 20 ___ 1002 ___ 1, 9
...
5 ______ 2 _______ 3 ___ 6501 ___ 3, 5, 7, 15
...
5 ______ 2 _______ 4 ___ 6502 ___ 1, 9
...

Las tres primeras columnas (Línea, Trayecto, Orden) son la clave de acceso (única).

Espero que alguien pueda echarme una mano, saludos a todos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Consulta anidada

Publicado por xve (86 intervenciones) el 09/12/2014 16:28:59
Hola Fernando, no me queda clara tu duda...

Los datos que nos muestras de como quieres que aparezcan, no se muy bien de donde aparecen...

Nos puedes mostrar el contenido de los registros, y de ahí el resultado que quieres mostrar, ya que viendo únicamente el resultado, sin sabes como es el contenido de la tabla...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta anidada

Publicado por Rafael (88 intervenciones) el 11/12/2014 15:05:32
Puedes probar con algo como esto:
1
2
3
4
5
6
7
8
9
SELECT Linea
     , Trayecto
     , Orden
     , Parada
     , STUFF(( SELECT  ','+ Linea
               FROM TableName a
               WHERE b.Parada = a.Parada FOR XML PATH('')),1 ,1, '') Correspondencias
FROM TableName b
GROUP BY Linea, Trayecto, Orden

Ya me contaras si ha funcionado o no...

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta anidada

Publicado por Fernando (2 intervenciones) el 12/12/2014 14:09:32
Muchas gracias Rafael, al final he optado por hacer una función en la Base de Datos y llamarla desde el SQL

La función es:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
USE [DB]
GO
/****** Object:  UserDefinedFunction [dbo].[ListaParadas]    Script Date: 12/10/2014 09:21:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:         fjhm
-- Create date: 09.12.2014
-- Description:   Retornar la lista de lineas de una parada
-- =============================================
ALTER FUNCTION [dbo].[ListaParadas]
(
	@iidparada INT,
	@iidlinea INT
)
RETURNS VARCHAR(1000)
AS
BEGIN
	DECLARE @idlinea INT;
	DECLARE @cadena VARCHAR(1000);
 
	DECLARE listasparadas CURSOR FORWARD_ONLY FOR
	SELECT DISTINCT iIdLinea
	FROM dbo.TITSA_DGN_ParadasTrayecto
	WHERE (iIdParada = @iidparada)
	ORDER BY iIdLinea
 
	OPEN listasparadas;
	FETCH NEXT FROM listasparadas
	INTO    @idlinea
	SET @cadena = '';
	WHILE (@@fetch_status = 0)
	BEGIN
		IF (@idlinea = @iidlinea)
		GOTO otro;
		SET @cadena = @cadena + CAST(@idlinea AS VARCHAR) + N',';
	otro:
		FETCH NEXT FROM listasparadas
		INTO @idlinea
	END
	CLOSE listasparadas;
	DEALLOCATE listasparadas;
	RETURN (@cadena)
END

Y en el SELECT de mi SQL la llamo simplemente pasándole el código de parada para el que quiero las correspondencias y el código de la línea que estoy listando para evitar que aparezca como correspondencia la propia línea:

dbo.ListaParadas(DB_ParadasTrayecto.iIdParada,DB_ParadasTrayecto.iIdLinea) AS 'Correspondencias'

y LISTO.

Me costó una semana y la ayuda de un compañero pero ya funciona y da algo como:

1
2
14	11	4	9424	GOYA	 26,228,901,911,971,972,
14	11	5	9425	BÉLGICA 26,228,901,911,971,972,

Que era lo que se pretendía.

Gracias por vuestro tiempo y espero que le sea de utilidad a otras personas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar