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

[SOLUCIONADO] SELECT de la fila mas completa

Estas en el tema de SELECT de la fila mas completa en el foro de SQL Server en Foros del Web. Hola a todos, En SQL Server 2008 R2 tengo la siguiente consulta: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original SELECT CODARTICULO , REFPROVEEDOR , NOMBRE = ...
  #1 (permalink)  
Antiguo 11/09/2013, 13:58
Avatar de hmvr414  
Fecha de Ingreso: marzo-2011
Ubicación: Santiago de Cali, Colombia
Mensajes: 74
Antigüedad: 13 años, 1 mes
Puntos: 16
SELECT de la fila mas completa

Hola a todos,

En SQL Server 2008 R2 tengo la siguiente consulta:

Código SQL:
Ver original
  1. SELECT CODARTICULO, REFPROVEEDOR, NOMBRE = A.DESCRIPCION, DESCRIPADIC, FOTO, FAM = F.DESCRIPCION, SF.DESCRIPCION, L.DESCRIPCION
  2.  
  3. FROM ARTICULOS A LEFT JOIN FAMILIAS F ON A.FAMILIA = F.NUMFAMILIA
  4. LEFT JOIN SUBFAMILIAS SF ON A.SUBFAMILIA = SF.NUMSUBFAMILIA
  5. LEFT JOIN LINEA L ON A.LINEA = L.CODLINEA

Lo que me da como resultado las siguientes tablas:

Código SQL:
Ver original
  1. COD REF     NOMBRE                                              FAMILIA     SUBFAMILIA  LINEA
  2. --- ---     ------                                              -------     ----------  ------
  3. 2   800001  T-SHIRT ADLT 180G ARITEX COLOR  NULL    NULL        CAMISETA    NULL        HOMBRE
  4. 2   800001  T-SHIRT ADLT 180G ARITEX COLOR  NULL    NULL        CAMISETA    CUELLO V    HOMBRE
  5. 2   800001  T-SHIRT ADLT 180G ARITEX COLOR  NULL    NULL        CAMISETA    NULL        HOMBRE
  6. 2   800001  T-SHIRT ADLT 180G ARITEX COLOR  NULL    NULL        CAMISETA    CUELLO V    HOMBRE
  7. 3   601238  BUSO MODA ADULTO SUISSE URBAN   NULL    NULL        CAMISETA    NULL        NIÑA
  8. 3   601238  BUSO MODA ADULTO SUISSE URBAN   NULL    NULL        CAMISETA    CUELLO V    NIÑA
  9. 3   601238  BUSO MODA ADULTO SUISSE URBAN   NULL    NULL        CAMISETA    NULL        NIÑA
  10. 3   601238  BUSO MODA ADULTO SUISSE URBAN   NULL    NULL        CAMISETA    CUELLO V    NIÑA
  11. 4   024204  BLUSA DAMA EMPAQUE MELY         NULL    NULL        CAMISETA    NULL        NIÑA
  12. 4   024204  BLUSA DAMA EMPAQUE MELY         NULL    NULL        CAMISETA    CUELLO V    NIÑA
  13. 4   024204  BLUSA DAMA EMPAQUE MELY         NULL    NULL        CAMISETA    NULL        NIÑA
  14. 4   024204  BLUSA DAMA EMPAQUE MELY         NULL    NULL        CAMISETA    CUELLO V    NIÑA

como pueden ver tengo hasta cuatro filas por cada producto por las variaciones en los tres ultimos campos FAMILIA, SUBFAMILIA y LINEA, pero solo estoy interezado en el campo por producto que tenga mas informacion, por ejemplo, si tengo los siguientes registros para un producto:

Código SQL:
Ver original
  1. COD NOMBRE      FAMILIA     SUBFAMILIA  LINEA
  2. --- ------      -------     ----------  -----
  3. 1   PRODUCTO 1  CAMISETAS   NULL        NULL
  4. 1   PRODUCTO 1  CAMISETAS   CUELLO V    NULL
  5. 1   PRODUCTO 1  CAMISETAS   CUELLO V    HOMBRE

quiero tomar solo el ultimo registro, que es el que tiene valores en todos los campos, pero si no hubiera un registro con valores en todos los campos, quiero tomar el segundo con mas informacion.

Hay alguna forma de hacer esto directamente en SQL??


Muchas gracias de antemano.

Última edición por hmvr414; 11/09/2013 a las 14:10 Razón: formateo tablas
  #2 (permalink)  
Antiguo 11/09/2013, 14:16
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: SELECT de la fila mas completa

quizas esto te ayude

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. id INT,
  4. nombre VARCHAR(20),
  5. desc1 VARCHAR(20),
  6. desc2 VARCHAR(20)
  7. )
  8.  
  9. INSERT INTO #temp VALUES (1,'PRODUCTO','CAMISETAS','OTRO Valor')
  10. INSERT INTO #temp VALUES (2,'PRODUCTO','CAMISETAS',NULL)
  11. INSERT INTO #temp VALUES (3,'PRODUCTO',NULL,NULL)
  12.  
  13.  
  14.  
  15. SELECT top 1 * FROM(
  16. SELECT cuantos+cuantos2+cuantos3 AS total,nombre,desc1,desc2 FROM (
  17. SELECT CASE WHEN isnull(nombre,'')='' THEN SUM(0) ELSE SUM(1) END AS cuantos,
  18. CASE WHEN isnull(desc1,'')='' THEN SUM(0) ELSE SUM(1) END AS cuantos2,
  19. CASE WHEN isnull(desc2,'')='' THEN SUM(0) ELSE SUM(1) END AS cuantos3,
  20. nombre,desc1,desc2 FROM #temp
  21. GROUP BY nombre,desc1,desc2)t1
  22. )t2 ORDER BY total DESC
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 11/09/2013, 14:47
Avatar de hmvr414  
Fecha de Ingreso: marzo-2011
Ubicación: Santiago de Cali, Colombia
Mensajes: 74
Antigüedad: 13 años, 1 mes
Puntos: 16
Respuesta: SELECT de la fila mas completa

Muchas gracias por la respuesta, es la mayor parte de lo que estoy buscando, pero como puedo hacer para aplicar este filtro y obtener una fila por cada producto?

si la tabla tiene estos datos:
Código SQL:
Ver original
  1. INSERT INTO #temp VALUES (1,'PRODUCTO','CAMISETAS','OTRO Valor')
  2. INSERT INTO #temp VALUES (2,'PRODUCTO','CAMISETAS',NULL)
  3. INSERT INTO #temp VALUES (3,'PRODUCTO',NULL,NULL)
  4. INSERT INTO #temp VALUES (4,'PRODUCTO 2','PANTALON','OTRO Valor')
  5. INSERT INTO #temp VALUES (5,'PRODUCTO 2','PANTALON',NULL)

como obtener este resultado:

Código SQL:
Ver original
  1. NOMBRE      DESC1       DESC2
  2. ------      -------     ----------
  3. PRODUCTO    CAMISETAS   OTRO VALOR      
  4. PRODUCTO 2  PANTALON    OTRO VALOR
  #4 (permalink)  
Antiguo 11/09/2013, 15:06
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: SELECT de la fila mas completa

Asi :)

Código SQL:
Ver original
  1. DROP TABLE #temp
  2. CREATE TABLE #temp
  3. (
  4. id INT,
  5. nombre VARCHAR(20),
  6. desc1 VARCHAR(20),
  7. desc2 VARCHAR(20)
  8. )
  9.  
  10. INSERT INTO #temp VALUES (1,'PRODUCTO','CAMISETAS','OTRO Valor')
  11. INSERT INTO #temp VALUES (2,'PRODUCTO','CAMISETAS',NULL)
  12. INSERT INTO #temp VALUES (3,'PRODUCTO',NULL,NULL)
  13. INSERT INTO #temp VALUES (4,'PRODUCTO 2','PANTALON','OTRO Valor')
  14. INSERT INTO #temp VALUES (5,'PRODUCTO 2','PANTALON',NULL)
  15.  
  16. DROP TABLE #temp2
  17.  
  18. SELECT nombre,total,desc1,desc2 INTO #temp2 FROM(
  19. SELECT cuantos+cuantos2+cuantos3 AS total,nombre,desc1,desc2 FROM (
  20. SELECT CASE WHEN isnull(nombre,'')='' THEN SUM(0) ELSE SUM(1) END AS cuantos,
  21. CASE WHEN isnull(desc1,'')='' THEN SUM(0) ELSE SUM(1) END AS cuantos2,
  22. CASE WHEN isnull(desc2,'')='' THEN SUM(0) ELSE SUM(1) END AS cuantos3,
  23. nombre,desc1,desc2 FROM #temp
  24. GROUP BY nombre,desc1,desc2)t1
  25. )t2  
  26.  
  27.  
  28. SELECT * FROM #temp2 WHERE CONVERT(VARCHAR(20),total) + '|' + nombre IN (
  29. SELECT CONVERT(VARCHAR(20),MAX(total)) + '|' + nombre FROM #temp2 GROUP BY nombre
  30. )
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 11/09/2013, 15:32
Avatar de hmvr414  
Fecha de Ingreso: marzo-2011
Ubicación: Santiago de Cali, Colombia
Mensajes: 74
Antigüedad: 13 años, 1 mes
Puntos: 16
Respuesta: SELECT de la fila mas completa

Gracias!! -- esa respuesta funcionó perfecto, es exactamente lo que he estado tratando de lograr todo el dia, de nuevo gracias.
  #6 (permalink)  
Antiguo 18/09/2013, 11:29
Avatar de otreblanc  
Fecha de Ingreso: mayo-2005
Ubicación: Chiapas, la última frontera...
Mensajes: 73
Antigüedad: 18 años, 11 meses
Puntos: 0
Respuesta: SELECT de la fila mas completa

En tu lugar depuraria la tabla ARTICULOS, ya que tienes registros duplicados con llaves foraneas en valor NULL, esto te acarrea problemas como el que estamos viendo (filas duplicadas) tanto en este reporte como en todas aquellas uniones que utilices dicha tabla.
  #7 (permalink)  
Antiguo 18/09/2013, 11:45
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: SELECT de la fila mas completa

Cita:
Iniciado por otreblanc Ver Mensaje
En tu lugar depuraria la tabla ARTICULOS, ya que tienes registros duplicados con llaves foraneas en valor NULL, esto te acarrea problemas como el que estamos viendo (filas duplicadas) tanto en este reporte como en todas aquellas uniones que utilices dicha tabla.
La tabla articulos esta bien, lo que esta mal quizas sean las uniones que esta realizando, pero como se necesitan sacar familias y subfamilias de productos es donde se obtiene el producto cartesiano de articulos duplicando los registros, aqui seria bueno analizar el diagrama E-R de la solucion
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 18/09/2013, 12:16
Avatar de otreblanc  
Fecha de Ingreso: mayo-2005
Ubicación: Chiapas, la última frontera...
Mensajes: 73
Antigüedad: 18 años, 11 meses
Puntos: 0
Respuesta: SELECT de la fila mas completa

Me parece buena idea, creo que el diseño de llaves primarias y foraneas en las tablas ARTICULOS y SUBFAMILIAS deberia reconsiderarse:

En la tabla ARTICULOS, la llave foranea para las Familias y Subfamilias deberia ser:
(FAMILIA,SUBFAMILIA)

La llave primaria para la tabla SUBFAMILIAS deberia ser:
(NUMFAMILIA, NUMSUBFAMILIA)

y la union a la SUBFAMILIAS seria mejor:
INNER JOIN SUBFAMILIAS as SF
ON (A.FAMILIA = SF.NUMFAMILIA AND A.SUBFAMILIA = SF.NUMSUBFAMILIA)

INNER JOIN porque se supone que primero llenas los catalogos de las familias y subfamilias antes de ingresar un nuevo articulo)

Etiquetas: select, server, sql
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 06:53.