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

Select que devuelva un registro por cada campo con valor

Estas en el tema de Select que devuelva un registro por cada campo con valor en el foro de SQL Server en Foros del Web. Hola que tal les hago una consulta. Tengo una tabla Compras: CompraId int pk not null Producto1 int Producto2 int Producto3 int Producto4 int Producto5 ...
  #1 (permalink)  
Antiguo 18/09/2012, 14:56
Avatar de Huasi  
Fecha de Ingreso: mayo-2007
Mensajes: 83
Antigüedad: 17 años
Puntos: 2
Select que devuelva un registro por cada campo con valor

Hola que tal les hago una consulta. Tengo una tabla Compras:

CompraId int pk not null
Producto1 int
Producto2 int
Producto3 int
Producto4 int
Producto5 int

Necesito crear un procedimiento almacenado con un select que lea cada registro y actue de la siguiente forma: si Producto1 tiene valor me devuelva el valor del mismo acompañado de la CompraId, si Producto2 es null no hace nada, si Producto3 tiene valor me devuelve el valor del mismo repitiendo el valor de CompraId y asi hasta llegar a Producto5 donde pasa a leer el proximo registro. La consulta quedaria algo asi:

Producto -- CompraId
0000001 -- 0000002
0000005 -- 0000002
0000007 -- 0000003
0000001 -- 0000004
0000004 -- 0000004
0000022 -- 0000004

Lo normal seria crear una tabla relacional pero para este caso puntual eso no es posible, gracias de antemano.
  #2 (permalink)  
Antiguo 18/09/2012, 15:08
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: Select que devuelva un registro por cada campo con valor

No es un simple

WHERE Producto IS NOT NULL
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 18/09/2012, 15:44
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 que devuelva un registro por cada campo con valor

y un case no sirve

select
case
when producto1<>'' or producto1 is not null then compraid
from tabla where producto2 is not null

o algo asi....o puedes explicar mas a fondo que necesitas??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 18/09/2012, 16:24
Avatar de Huasi  
Fecha de Ingreso: mayo-2007
Mensajes: 83
Antigüedad: 17 años
Puntos: 2
Respuesta: Select que devuelva un registro por cada campo con valor

Voy a reducir la tabla a 3 campos producto para que sea mas sencillo y los voy a escribir para no confundir con el entero. Supongamos que tengo los sig 3 registros:

CompraId: 1
Producto1: Mesa
Producto2: NULL
Producto3: Silla

CompraId: 2
Producto1: NULL
Producto2: NULL
Producto3: Vaso

CompraId: 3
Producto1: Plato
Producto2: Mesa
Producto3: Disco

Necesito que el select me arroje esto:

CompraId - Producto
1 - Mesa
1 - Silla
2 - Vaso
3 - Plato
3 - Mesa
3 - Disco
  #5 (permalink)  
Antiguo 18/09/2012, 16:39
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Select que devuelva un registro por cada campo con valor

Código SQL:
Ver original
  1. SELECT CompraId,
  2.           Producto1
  3. FROM MiTabla
  4. WHERE Producto1 IS NOT NULL
  5. UNION ALL
  6. SELECT CompraId,
  7.           Producto2
  8. FROM MiTabla
  9. WHERE Producto2 IS NOT NULL
  10. UNION ALL
  11. SELECT CompraId,
  12.           Producto3
  13. FROM MiTabla
  14. WHERE Producto3 IS NOT NULL;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #6 (permalink)  
Antiguo 19/09/2012, 06:21
Avatar de Huasi  
Fecha de Ingreso: mayo-2007
Mensajes: 83
Antigüedad: 17 años
Puntos: 2
Respuesta: Select que devuelva un registro por cada campo con valor

Gracias a los 3 por responder, solucionado con la respuesta de Geri.

Etiquetas: cada, registro, select, tabla, campos
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 08:06.