Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] Consulta SQL para realizar vista de arbol

Estas en el tema de Consulta SQL para realizar vista de arbol en el foro de SQL Server en Foros del Web. Buenas tardes, Lo primero de todo permitirme presentarme. Actualmente trabajo como diseñador web y pese a que en el pasado (hace mas de 8 años) ...
  #1 (permalink)  
Antiguo 19/08/2014, 11:57
 
Fecha de Ingreso: abril-2005
Mensajes: 16
Antigüedad: 19 años
Puntos: 0
Pregunta Consulta SQL para realizar vista de arbol

Buenas tardes,

Lo primero de todo permitirme presentarme. Actualmente trabajo como diseñador web y pese a que en el pasado (hace mas de 8 años) trabajé esporádicamente con SQL, ahora me centro mas en programacion en java y demas cosillas.

El problema es que estoy trabajando en Holanda y mi jefe me ha pedido si puedo hacer una consulta sobre una base de datos que tienen en Filemaker. Revisando, he visto que se pueden hacer consultas SQL y pese a que he intentando muchas consultas, creo que tengo todo el sql muy oxidado porque no consigo ningún resultado..

Lo que tengo que hacer es consultar una tabla con mas de dos millones de registros de acuerdo a 4 columnas y partir de ahí hacer una especie de arbol hasta llegar a la 4 columna donde tengo que saber el numero de un valor determinado..

Os pongo una tabla de ejemplo y el resultado esperado a ejemplo ver si me podéis ayudar:

Tipo Marca Modelo Color

Coche Renault Twingo Rojo
Coche Renault Twingo Negro
Coche Renault Clio Blanco
Coche Opel Astra Rojo
Coche Opel Insignia Azul
Coche Opel Insignia Blanco
Moto Yamaha Bandit Plata
Moto Yamaha Bandit Blanco
Moto Yamaha Bandit Negra

Resultados:

Coche Renault Twingo 2(número total de ese modelo) 1(número de total de modelos rojos)
Coche Renault Clio 1(número total de ese modelo) 0(número de total de modelos rojos)
Coche Opel Astra 1(número total de ese modelo) 1(número de total de modelos rojos)
Coche Opel Insignia 2(número total de ese modelo) 0(número de total de modelos rojos)
Moto Yamaha Bandit 3(número total de ese modelo) 0(número de total de modelos rojos)
  #2 (permalink)  
Antiguo 19/08/2014, 14:20
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL para realizar vista de arbol

te explicas mejor cuales son las reglas que sigues para obtener los resultados?? porque comparas contra rojo todo?? estas trabajando con SQL Server o solamente estas usando TSQL??? Porque las reglas de sintaxis son diferentes dependiendo el manejador.......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 19/08/2014, 14:31
 
Fecha de Ingreso: abril-2005
Mensajes: 16
Antigüedad: 19 años
Puntos: 0
Respuesta: Consulta SQL para realizar vista de arbol

Cita:
Iniciado por Libras Ver Mensaje
te explicas mejor cuales son las reglas que sigues para obtener los resultados?? porque comparas contra rojo todo?? estas trabajando con SQL Server o solamente estas usando TSQL??? Porque las reglas de sintaxis son diferentes dependiendo el manejador.......
Hola Libras,

Viendo lo que he escrito, tienes razón que no está muy claro.. El problema es que la tabla que te indico (lo del rojo) es un ejemplo similar a lo que uso, ya que todos los datos de mi tabla están en holandés..

Lo que necesito es que me saque todos los valores únicos de la primera columna, seguidamente me diga todos los valores de la columna 2 que se asocian con 1, y posteriormente todos los de 3 que se asocian en 2. Finalmente de la columna 4 tendría que contar el total y también los que cumplen una determinada condición.
De acuerdo al ejemplo, el árbol se abre con al primera columna: coche, posteriormente la marca y el coche, y finalmente el numero total de coches que cumplen los valores anteriores y cuantos de ellos cumplen la condición (que sean rojos).

Poniendo el ejemplo de los coche renault la linea seria:
coche renault twingo 2 1 (total de 2 coches y uno cumple la condición que sea rojo)
coche clio twingo 1 0 (total de 1 coche y ninguno cumple la condición que sea rojo)

Con respecto al manejador, debo utilizar SQL Server
  #4 (permalink)  
Antiguo 19/08/2014, 14:35
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL para realizar vista de arbol

eso esta sencillo, con una funcion recursiva, ahora el problema, como esta organizada la informacion en tu tabla? si esta asi como la planteas esta un poco complicado....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 19/08/2014, 14:40
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta SQL para realizar vista de arbol

¿No hay una serie de CATALOGOS y la tabla que muestras es la que contiene las relaciones?
__________________
MCTS Isaias Islas
  #6 (permalink)  
Antiguo 19/08/2014, 15:56
 
Fecha de Ingreso: abril-2005
Mensajes: 16
Antigüedad: 19 años
Puntos: 0
Respuesta: Consulta SQL para realizar vista de arbol

Buenas noches a ambos!

La tabla llega a tener hasta 50 campos únicos, pero los que me interesan son solo 4 en concreto. Todos ellos forman parte de la tabla (no catálogos, tabla única) y cada uno bajo una columna con un nombre de campo diferente (exactamente como os indico).

¿Cuando me dices lo de función recursiva te refieres al uso de subqueries? ¿De que manera podría hacerlo?

Muchas gracias de nuevo por vuestra ayuda
  #7 (permalink)  
Antiguo 19/08/2014, 16:20
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta SQL para realizar vista de arbol

aragon

Te la estas complicando o bien, tu tabla no tiene pies ni cabeza, o sea, no esta NORMALIZADA
__________________
MCTS Isaias Islas
  #8 (permalink)  
Antiguo 19/08/2014, 16:28
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL para realizar vista de arbol

una funcion recursiva no son subqueries, es una funcion que se llama a si misma para obtener los valores de la forma que necesitas, si tu tabla esta como la has puesto entonces no esta normalizada como bien te comentan......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 22/09/2014, 08:23
 
Fecha de Ingreso: abril-2005
Mensajes: 16
Antigüedad: 19 años
Puntos: 0
Respuesta: Consulta SQL para realizar vista de arbol

Buena tardes,

Perdonar el retraso, pero unas cuestiones familiares y el haber estado pidiendo a mis compañeros holandeses los archivos de origen a traves de los cuales habian creado la caótica tabla me han llevado mas tiempo del previsto.

¿Podriais indicarme como organiazr una nueva tabla de manera que esté normalizada?

Muchas gracias a todos y perdonar por las molestias.
  #10 (permalink)  
Antiguo 22/09/2014, 08:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL para realizar vista de arbol

un ejemplo de tus datos ayudaria mucho ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 23/09/2014, 07:42
 
Fecha de Ingreso: abril-2005
Mensajes: 16
Antigüedad: 19 años
Puntos: 0
Respuesta: Consulta SQL para realizar vista de arbol

Buenas tardes Libras!

Tras revisar todos los archivos que me han pasado, he descubierto que toda la información que preciso proviene de dos archivos csv:

1 - En el primero, incluye el número de registros totales (Mas de 2 millones de filas) y entre una multitud de campos, incluye los campos "area" y "subarea".

2 - Otro csv que incluye unos 14000 registros (Que tambien están incluidos en el archivo anterior) y que indica nuestros clientes mediente un campo "status".

La unica forma de relacionar ambos ficheros es mediante la concatenación de tres campos que estan presentes en ambos archivos "Código postal", "número" y "extra".

Por ponerte un ejemplo de las lineas del fichero mas grande :

Area | Sub Area | CP | Número | Extra
Brabante | Nord Eindhoven | 1186VZ | 5 |
Brabante | Nord Eindhoven | 1186VZ | 7 |
Brabante | Nord Eindhoven | 1186VZ | 9 |
Brabante | Nord Eindhoven | 1186VZ | 9 | A
Brabante | Nord Eindhoven | 1186VZ | 11 |
Brabante | Zuid Eindhoven | 1195AS | 232 |

Mientras que un ejemplo de una linea del segundo fichero sería:

CP | Numero | Extra | Status
1186VZ | 5 | | Completed
5836AB | 12 | | Completed

Lo que yo precisaria hacer es una consulta que me dijese:

1 - El número total de registros presentes en el fichero 1 de cada "subarea".
2 - El número de registros presentes en el fichero 2 para cada subarea.

Y el resultado final para el ejemplo que te habia indicado:
Area | SubArea | total | clientes
Brabante | Nord Eindhoven | 5 | 1
Brabante | Zuid Eindhoven | 1 |
  #12 (permalink)  
Antiguo 23/09/2014, 08:03
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL para realizar vista de arbol

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. area VARCHAR(20),
  4. subarea VARCHAR(50),
  5. cp VARCHAR(20),
  6. numero INT,
  7. extra VARCHAR(20)
  8. )
  9.  
  10. INSERT INTO #temp VALUES ('Brabante','Nord Eindhoven','1186VZ',5,'')
  11. INSERT INTO #temp VALUES ('Brabante','Nord Eindhoven','1186VZ',7,'')
  12. INSERT INTO #temp VALUES ('Brabante','Nord Eindhoven','1186VZ',9,'')
  13. INSERT INTO #temp VALUES ('Brabante','Nord Eindhoven','1186VZ',9,'A')
  14. INSERT INTO #temp VALUES ('Brabante','Nord Eindhoven','1186VZ',11,'')
  15. INSERT INTO #temp VALUES ('Brabante','Zuid Eindhoven','1195AS',232,'')
  16.  
  17. CREATE TABLE #temp2
  18. (
  19. cp VARCHAR(20),
  20. numero INT,
  21. extra VARCHAR(20),
  22. STATUS VARCHAR(20)
  23. )
  24.  
  25. INSERT INTO #temp2 VALUES ('1186VZ',5,'','Completed')
  26. INSERT INTO #temp2 VALUES ('5836AB',12,'','Completed')
  27.  
  28.  
  29. SELECT area, subarea,COUNT(subarea) total ,SUM(clientes) clientes FROM(
  30. SELECT
  31. area,subarea,
  32. CASE WHEN isnull(t2.numero,0)=0 THEN 0 ELSE 1 END AS clientes
  33. FROM #temp AS t1
  34. FULL OUTER JOIN #temp2 AS t2 ON (t1.cp=t2.cp AND t1.numero=t2.numero AND t1.extra=t2.extra)
  35. ) t3
  36. WHERE area IS NOT NULL
  37. GROUP BY area,subarea

con algo como eso ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #13 (permalink)  
Antiguo 24/09/2014, 08:24
 
Fecha de Ingreso: abril-2005
Mensajes: 16
Antigüedad: 19 años
Puntos: 0
Respuesta: Consulta SQL para realizar vista de arbol

Cita:
Iniciado por Libras Ver Mensaje
Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. area VARCHAR(20),
  4. subarea VARCHAR(50),
  5. cp VARCHAR(20),
  6. numero INT,
  7. extra VARCHAR(20)
  8. )
  9.  
  10. INSERT INTO #temp VALUES ('Brabante','Nord Eindhoven','1186VZ',5,'')
  11. INSERT INTO #temp VALUES ('Brabante','Nord Eindhoven','1186VZ',7,'')
  12. INSERT INTO #temp VALUES ('Brabante','Nord Eindhoven','1186VZ',9,'')
  13. INSERT INTO #temp VALUES ('Brabante','Nord Eindhoven','1186VZ',9,'A')
  14. INSERT INTO #temp VALUES ('Brabante','Nord Eindhoven','1186VZ',11,'')
  15. INSERT INTO #temp VALUES ('Brabante','Zuid Eindhoven','1195AS',232,'')
  16.  
  17. CREATE TABLE #temp2
  18. (
  19. cp VARCHAR(20),
  20. numero INT,
  21. extra VARCHAR(20),
  22. STATUS VARCHAR(20)
  23. )
  24.  
  25. INSERT INTO #temp2 VALUES ('1186VZ',5,'','Completed')
  26. INSERT INTO #temp2 VALUES ('5836AB',12,'','Completed')
  27.  
  28.  
  29. SELECT area, subarea,COUNT(subarea) total ,SUM(clientes) clientes FROM(
  30. SELECT
  31. area,subarea,
  32. CASE WHEN isnull(t2.numero,0)=0 THEN 0 ELSE 1 END AS clientes
  33. FROM #temp AS t1
  34. FULL OUTER JOIN #temp2 AS t2 ON (t1.cp=t2.cp AND t1.numero=t2.numero AND t1.extra=t2.extra)
  35. ) t3
  36. WHERE area IS NOT NULL
  37. GROUP BY area,subarea

con algo como eso ;)
Hola de nuevo Libras,

Toda la parte de crear tabla e introducir los datos ha ido bien (he tenido que quitar los # delante de los nombres ya que si no el phpmyadmin no me dejaba), pero a la hora de hacer la consulta, recibo el siguiente error:

#1582 - Incorrect parameter count in the call to native function 'isnull'

Suponiendo que la funcion se escribe separada, me da el siguiente error:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'is null(t2.numero,0)=0 THEN 0 ELSE 1 END AS clientes
FROM temp AS t1
FULL OUTER ' at line 4

Muchas gracias de nuevo por tu ayuda
  #14 (permalink)  
Antiguo 24/09/2014, 08:41
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta SQL para realizar vista de arbol

que?????? estas usando Mysql? la sintaxis que te di es para sql server porque este es un foro de SQL SERVER, porque no dijiste que trabajabas con Mysql desde un principio

P.S: Revisando los post dijiste "Con respecto al manejador, debo utilizar SQL Server" aqui el debo se refiere a, no se cual uso pero creo que es sql server o a deberia de utilizar sql server, aunque supongo que era la primer opcion
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #15 (permalink)  
Antiguo 24/09/2014, 09:07
 
Fecha de Ingreso: abril-2005
Mensajes: 16
Antigüedad: 19 años
Puntos: 0
Respuesta: Consulta SQL para realizar vista de arbol

Cita:
Iniciado por Libras Ver Mensaje
que?????? estas usando Mysql? la sintaxis que te di es para sql server porque este es un foro de SQL SERVER, porque no dijiste que trabajabas con Mysql desde un principio

P.S: Revisando los post dijiste "Con respecto al manejador, debo utilizar SQL Server" aqui el debo se refiere a, no se cual uso pero creo que es sql server o a deberia de utilizar sql server, aunque supongo que era la primer opcion
Hola de nuevo Libras,

Lo primero de todo no puedo hacer otra cosa mas que pedirte mis mas sinceras disculpas.
Todo el error se debe a mi desconocimiento del tema entre las diferencias existentes entre Mysql y SQL server (que creia que era similar). La respuesta por el manejador vino dada por la consulta a mi actual jefe de proyecto holandés que me dijo que lo tendria que hacer en algo de "SQL", a lo que yo posteriormete metí la pata hasta el fondo. Al tener la bae de datos de mas de 2GB en filemaker, la única solución temporal que encontré en trabajar con PHPmyadmin (que es lo que domino para manejar bases de datos por el uso de CMS) y como en la pestaña de consultas pone SQL, creia que era SQl, en vez de MySQL como he aprendido ahora mismo..

¿Se puede adaptar tu código a MySQL?

Si consideras que se debe cerrar el tema y debo abrir uno nuevo en el foro Mysql, lo haré inmeditamante.

Perdona de nuevo por todo el jaleo creado
  #16 (permalink)  
Antiguo 24/09/2014, 09:20
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta SQL para realizar vista de arbol

Pedirle al moderador que mueva tu post a MYSQL
__________________
MCTS Isaias Islas
  #17 (permalink)  
Antiguo 25/09/2014, 04:34
 
Fecha de Ingreso: abril-2005
Mensajes: 16
Antigüedad: 19 años
Puntos: 0
Respuesta: Consulta SQL para realizar vista de arbol

Cita:
Iniciado por iislas Ver Mensaje
Pedirle al moderador que mueva tu post a MYSQL
Buenos días,

La opción que comentas iislas me parece buena idea para solucionar mi problema, pero creo que si alguien tiene el mismo problema en SQL Server, la solución que ha aportado libras puede resultarle muy util.

Que os parece mas acertado ¿Pedir al moderador que mueva el hilo a MYSQL o poner este como solucionado y abrir uno nuevo en el subforo MYSQL con una explicación clara empezando de 0?

Muchas gracias a ambos

Última edición por aragonexiste; 25/09/2014 a las 05:57
  #18 (permalink)  
Antiguo 25/09/2014, 10:02
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta SQL para realizar vista de arbol

Perfecto !!
__________________
MCTS Isaias Islas
  #19 (permalink)  
Antiguo 25/09/2014, 10:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta SQL para realizar vista de arbol

Abrir hilo en MySQL, por favor, planteando el problema básico.

Thread cerrado para evitar confusiones.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: query
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 12:52.