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

Una SELECT complicado que me trae de cabeza

Estas en el tema de Una SELECT complicado que me trae de cabeza en el foro de SQL Server en Foros del Web. Muy buenas. El nuevo problema que ahora tengo es el siguiente: Estoy haciendo un menú el cual me tiene que listar las categorías que tiene ...
  #1 (permalink)  
Antiguo 17/12/2008, 05:13
 
Fecha de Ingreso: noviembre-2008
Ubicación: Barcelona
Mensajes: 52
Antigüedad: 16 años, 1 mes
Puntos: 0
Una SELECT complicado que me trae de cabeza

Muy buenas.

El nuevo problema que ahora tengo es el siguiente:
Estoy haciendo un menú el cual me tiene que listar las categorías que tiene un fabricante. Ya he desarrollado parte de él para otros niveles pero en este nivel estoy atascado desde hace un par de días y la consulta no me sale. Es un SQL 2000.

La idea es la siguiente tengo una tabla CATEGORIAS y una tabla PRODUCTO y tengo que listar todas las categorías que pertenecen a un fabricante en concreto.

La tabla PRODUCTO tiene así mismo el código de la categoría CODCAT el fabricante FABRICA y los niveles de categoría dentro del menú CAT0, CAT1 y CAT2
El nivel CAT0 = 1 significa que pertenece a la categoría 1
El nivel CAT1 = 12 significa que pertenece a la categoría 12
El nivel CAT2 = 12 significa que también pertenece a la categoría 12 (Por lo tanto este artículo se mostrará también en ese nivel)
El nivel CAT2 = PC y CAT1 = 11 significa que este producto no se mostrará en la categoría con nivel 11 sino que de ella se desplegará otra categoría CAT2 = PC donde en esta si estarán todas las categoría con productos
En cuanto a TIENE_ARTIC significa si es 1 que en esta categoría ya tiene productos que dependen de ella y si es 0 significa que de esta categoría se desplegará otra categoría

Por ejemplo:

Código:
	1 ORDENADORES
		12	ORDENADORES AX	
		13	PORTATILES
			1310	PORTATIL ACER	
			* 132	PORTATIL HP	
			* 1329	ACCESORIOS HP
			133	PORTATIL TOSHIBA
			NA	Netbook			
			NB	Portátiles (>= 14 Pulg.)		
			* AN	Accesorios 	
				AN1	Accesorios		
				AN2	Accesorios Baterias	
				AN9	Accesorios Varios 
	2 DISPOSITIVOS
		21	CAJAS CONEX
De esta forma según las tablas que adjunto de ejemplo, si tengo que listar las categorías con nivel 13 que tienen articulos del fabricante 009 solo se mostrarán las categorías marcadas arriba con un asterisco, la 132, la 1329 y la AN porque son las únicas que cumplen con el nivel que les pertenece y que dentro tienen productos o subcategorías que tienen productos con el fabricante 009

Espero haberme explicado lo mejor posible. He probado de todo, pero no me acaba de funcionar, o me saca más de la cuenta o me falta alguna...

Código:
	TABLA: categorias
	==============
	codcat	descrip			nivel	tiene_artic
	MU	Modem Internos	61	0		
	A07	Estuches De Mp3	AK	1	
	AS	AccesoriosPC		11	0	
	40103	Altavoces activos	40	1	
	42105	Altavoces megafonia	42	1	
	AN1	Accesorios		AN	1		
              AN2	Accesorios Baterias	AN	1	
 	FD	Camaras		25	0
 	TI	PDA 			14	0
	1124	Ordenadores HP 	11	1
	PC	PCSobremesa		11	0	
	1	ORDENADORES	0	0	
	12	ORDENADORES AX	1	0
	13	PORTATILES		1	0
	1310	PORTATIL ACER	13	1	
	132	PORTATIL HP		13	1
	1329	ACCESORIOS HP	13	1
                133	PORTATIL TOSHIBA	13	1
	NA	Netbook		13	0		
	NB	Portátiles (>= 14 Pulg.)	13	0		
	AN	Accesorios 		13	0	
	2	DISPOSITIVOS		0	0
	21	CAJAS CONEX		2	0	
	AN9	Accesorios Varios 	AN	1

Código:
	TABLA: producto
	==============
	cod		descrip_art		  	codcat		fabrica		cat0	cat1	cat2  
	12220378	SERVIDOR HP PROLIANT DL360 	1222	    	009		1	12	12
	16005250	GPS GARMIN			16005		123		1	16	16
	11241250	ORDENADOR HP-COMPAQ 1		1124		009		1	11	11
	11241251	ORDENADOR HP-COMPAQ 2		1124		009		1	11	11
	ES-AK819AW	HP DC5800 C2D E8400 		PCE		009		1	11	PC
	ES-DC198A	HP DVI CABLE KIT		AS6		009		1	11	AS	
 	22110325	PLOTTER COLOR HP 		2211		009		2	22	22
	ES-AJ749A	HP BANDEJA 12HDS  		SX1		009		3	33	SX
	13201340	PORTATIL HP			132		009		1	13	13
	LX.TPX0Z.249	T94004G320G15W 			NBD		249		1	13	NB
	TGXAM127	PANTALLA 15.4 WIDESCR		AN9		073		1	13	AN
	AJ356AA	HP 12.1 DISPLAY			AN9		009		1	13	AN	
             13290015	CARGADOR HP			1329		009		1	13	13 

Última edición por jose_cab; 17/12/2008 a las 06:49 Razón: SE CAMBIA EL FORMATO
  #2 (permalink)  
Antiguo 17/12/2008, 14:07
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 19 años, 4 meses
Puntos: 39
Respuesta: Una SELECT complicado que me trae de cabeza

Este script muestra lo que seleccionaste en rojo.
Código sql:
Ver original
  1. SELECT c.codcat,c.descrip [categoria]
  2. FROM producto p
  3. INNER JOIN categorias c ON p.codcat=c.codcat
  4. WHERE p.fabrica='009'
  5. AND p.cat1=13
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 18/12/2008, 05:59
 
Fecha de Ingreso: noviembre-2008
Ubicación: Barcelona
Mensajes: 52
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Una SELECT complicado que me trae de cabeza

Gracias FlavioVich, pero no es eso lo que busco.

No tiene que mostrar los productos sino las categorías marcadas en rojo y solo esas.

Este codigo se acerca mucho a lo que busco pero no funciona del todo porque me muestra más categorías de las que necesito:

Código:
SELECT     c.codcat, c.descrip,c.tiene_artic
FROM         categoria c INNER JOIN
                      producto p ON c.nivel = p.cat1 AND p.codcat = '009' AND c.codcat = p.codcat
WHERE     (p.cat2 = '13')
UNION
SELECT     c.codcat, c.descrip,c.tiene_artic
FROM         categoria c INNER JOIN
                     producto p ON c.nivel = p.cat1 AND p.codcat = '009' AND c.tiene_arti = 0
WHERE     (p.cat1 = '13')
ORDER BY c.descrip
Me empieza a superar... Desde hace ya 4 o 5 días que busco y pruebo, pero no acabo de ajustar bien la consulta...

Confío en que los entendidos vean lo que a mi se me escapa

Gracias de antemano
  #4 (permalink)  
Antiguo 18/12/2008, 06:38
 
Fecha de Ingreso: noviembre-2008
Ubicación: Barcelona
Mensajes: 52
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: CREO QUE LO TENGO!! Una SELECT complicado que me trae de cabeza

Creo que lo tengo...

Estoy probandolo y aparentemente funciona, Si alguien le quiere dar un vistazo por si me dejo algo se agradecería

Si alguien tiene ota forma de hacerlo que agilice más la consulta de cara a SQL2000, se agradecerá más todavía.

Código:
SELECT     c.codcat, c.descrip,c.tiene_artic
FROM         categoria c INNER JOIN
                      producto p ON c.nivel = p.cat1 AND p.codcat = '009' AND c.codcat = p.codcat
WHERE     (p.cat2 = '13')
UNION
SELECT     c.codcat, c.descrip,c.tiene_artic
FROM         categoria c INNER JOIN
                     producto p ON c.nivel = p.cat1 AND p.codcat = '009' AND p.cat2 <> '13'
WHERE     (p.cat1 = '13') AND c.tiene_arti = 0
ORDER BY c.descrip
  #5 (permalink)  
Antiguo 18/12/2008, 17:31
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 19 años, 4 meses
Puntos: 39
Respuesta: Una SELECT complicado que me trae de cabeza

A mi me sale lo que has marcado en rojo:
Código sql:
Ver original
  1. SELECT p.*
  2. FROM producto p
  3. INNER JOIN categorias c ON p.codcat=c.codcat
  4. WHERE p.fabrica='009'
  5. AND p.cat1=13
Revisa bien mi query.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:54.