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

Ayuda con dos Selects en una sola tabla.

Estas en el tema de Ayuda con dos Selects en una sola tabla. en el foro de SQL Server en Foros del Web. Hola a todos. Tengo una tabla con un aspecto similar a este: tabla: precios Codigo Oferta Fecha Precio A0001 0 12/04/2000 13€ A0020 1 13/06/2002 ...
  #1 (permalink)  
Antiguo 19/11/2008, 02:46
 
Fecha de Ingreso: noviembre-2008
Mensajes: 3
Antigüedad: 15 años, 5 meses
Puntos: 0
Ayuda con dos Selects en una sola tabla.

Hola a todos.

Tengo una tabla con un aspecto similar a este:

tabla: precios
Codigo Oferta Fecha Precio
A0001 0 12/04/2000 13€
A0020 1 13/06/2002 20€
A0001 1 21/07/2001 10€

No se como hacer lo siguiente, he de sacar por un lado todos los registros con oferta = 0 y con otra select los que contengan oferta = 1
Y ahora es donde viene la complicacion, mediante las fechas, el precio debe ser el más actual posible.

He probado algo parecido a esto, pero no funciona:

Select * from precios
where precios.fecha = (Select MAX(precios_2.fecha) from precios precios_2
where precios_2.codigo = precios.codigo
and precios_2.oferta = 1)

Y me da el siguiente error:
El identificador formado por varias partes "precios_2.oferta" no se pudo enlazar.
Si coloco la condicion de oferta fuera de la select anidada, en todos los productos cuya ultima fecha introducida corresponda con oferta = 0 no los muestra.

No se que mas probar, alguien tiene alguna idea?

Muchas gracias de antemano.
  #2 (permalink)  
Antiguo 19/11/2008, 04:30
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Ayuda con dos Selects en una sola tabla.

Hola,

Posiblemente lo puedas realizar de la siguiente forma...

Código:
-- 1)
select distinct a.codigo,
(
  select top 1 b.precio
  from precios b
  where a.codigo = b.codigo and a.oferta = b.oferta
  order by b.fecha desc
) precio
from precios a
where a.oferta = 1
go
Código:
-- 2)
select distinct a.codigo, a.precio
from precios a
inner join
(
  select codigo, oferta, max(fecha) as ultima_fecha
  from precios
  group by codigo, oferta
) b on a.codigo = b.codigo and a.oferta = b.oferta
where a.fecha = b.ultima_fecha and a.oferta = 1
go
Las dos instrucciones deberían funcionar para hacer lo mismo.
No estoy seguro cual sería la mejor, tampoco sé si existe una forma más adecuada.

Saludos,

Este texto está de colores, :) .
  #3 (permalink)  
Antiguo 19/11/2008, 10:07
 
Fecha de Ingreso: noviembre-2008
Mensajes: 3
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Ayuda con dos Selects en una sola tabla.

Muchas gracias HackmanC,

He probado la segunda opción que has dado ya que me parecia más facil conceptualmente, y al aplicarla ha dado justo el resultado que queria,

El problema es que ahora, me ha resurgido un problema que ya solucione anteriormente.

Veras, además de la tabla de precios tengo una para productos, otra para las familias, otra para los fabricantes... y se relacionan todas con un codigo que esta en la tabla de productos.

Yo hacia una cosa mas o menos similar a esta:
Código:
SELECT productos.nombre, productos.descripcion, familia.descripcion, fabricantes.descripcion, precios.precio, precios.fecha
FROMprecios, productos
INNER JOIN familia ON productos.codfam = familia.codfam
INNER JOIN fabricante ON productos.codfab = fabricantes.codfab
WHERE productos.codprod = precios.codprod
Al hacer los cambios sugeridos, he conseguido meter los campos de la tabla productos, pero no puedo poner los que enlazan a las otras tablas. El error que me da es el siguiente:
El identificador formado por varias partes "productos.CODFAM" no se pudo enlazar.

Igual es una tonteria pero... sabes a que puede ser debido?

Muchas gracias,

Alex.
  #4 (permalink)  
Antiguo 19/11/2008, 13:16
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Ayuda con dos Selects en una sola tabla.

Hola,

No tengo ni idea, nunca había leído el error ...
El identificador formado por varias partes $var no se pudo enlazar.
(Posiblemente porque siempre lo uso en inglés. )
Y no pude reproducir el error, porque la instrucción me funciona correctamente.

Código:
select productos.codigo, productos.descripcion, familia.descripcion, fabricante.descripcion, precios.precio, precios.fecha
from precios, productos
inner join familia on productos.codfam = familia.codfam
inner join fabricante on productos.codfab = fabricante.codfab
where productos.codigo = precios.codigo
go
Aunque sería preferible que uses solamente 'joins' en favor de 'from tab1, tab2 where' o por lo menos solamente uno de los dos.

Código:
select a.codigo, a.descripcion, d.descripcion, e.descripcion, b.precio, b.fecha
from productos a
left join precios b on a.codigo = b.codigo
left join
(
  select codigo, oferta, max(fecha) as ultima_fecha
  from precios
  group by codigo, oferta
) c on b.codigo = c.codigo and b.oferta = c.oferta
left join familia d on a.codfam = d.codfam
left join fabricante e on a.codfab = e.codfab
where b.fecha = c.ultima_fecha and b.oferta = 1
order by a.codigo
go
Sería muy útil y de mucha cortesía que escribieras un script para reproducir 'exactamente' el problema.
Saludos,

Código:
-- MSSSQLServer 2000
create database test
go
use test
go

create table productos (codigo char(5) primary key, descripcion varchar(80), codfam char(5), codfab char(5))
create table precios (codigo char(5), oferta bit, fecha smalldatetime, precio money)
create table familia (codfam char(5) primary key, descripcion varchar(80))
create table fabricante (codfab char(5) primary key, descripcion varchar(80))
go

insert into familia (codfam, descripcion) values ( 'FM1', 'Descripcion Familia FM1')
insert into fabricante (codfab, descripcion) values ( 'FB1', 'Descricion Fabricante FB1')
insert into productos (codigo, descripcion, codfam, codfab) values ( 'A1', 'Descripcion Producto A1', 'FM1', 'FB1')
insert into productos (codigo, descripcion, codfam, codfab) values ( 'A2', 'Descripcion Producto A2', 'FM1', 'FB1')
insert into precios (codigo, oferta, fecha, precio) values ( 'A2', 1, '20080103', 2999)
insert into precios (codigo, oferta, fecha, precio) values ( 'A2', 1, '20080101', 3000)
insert into precios (codigo, oferta, fecha, precio) values ( 'A1', 1, '20080102', 2000)
insert into precios (codigo, oferta, fecha, precio) values ( 'A1', 1, '20080101', 1999)
go

-- SELECT productos.nombre, productos.descripcion, familia.descripcion, fabricantes.descripcion, precios.precio, precios.fecha
-- FROM precios, productos
-- INNER JOIN familia ON productos.codfam = familia.codfam
-- INNER JOIN fabricante ON productos.codfab = fabricantes.codfab
-- WHERE productos.codprod = precios.codprod

select productos.codigo, productos.descripcion, familia.descripcion, fabricante.descripcion, precios.precio, precios.fecha
from precios, productos
inner join familia on productos.codfam = familia.codfam
inner join fabricante on productos.codfab = fabricante.codfab
where productos.codigo = precios.codigo
go

select a.codigo, a.descripcion, d.descripcion, e.descripcion, b.precio, b.fecha
from productos a
left join precios b on a.codigo = b.codigo
left join
(
  select codigo, oferta, max(fecha) as ultima_fecha
  from precios
  group by codigo, oferta
) c on b.codigo = c.codigo and b.oferta = c.oferta
left join familia d on a.codfam = d.codfam
left join fabricante e on a.codfab = e.codfab
where b.fecha = c.ultima_fecha and b.oferta = 1
order by a.codigo
go

select * from productos
select * from precios
select * from familia
select * from fabricante
go

delete from productos
delete from precios
delete from familia
delete from fabricante
go

use master
drop database test
go
Este texto está de colores ... en SQL Server :-)
  #5 (permalink)  
Antiguo 20/11/2008, 16:11
 
Fecha de Ingreso: noviembre-2008
Mensajes: 3
Antigüedad: 15 años, 5 meses
Puntos: 0
Sonrisa Respuesta: Ayuda con dos Selects en una sola tabla.

Perdón por tardar en responder.

Grácias de nuevo HackmanC, de veras. Ya he podido solucionar mi problema :)

No solo aplaudo tus conocimientos de sql, sino además la capacidad de entender mi problema con la poca información que he dado y darme una respuesta rápida y perfectamente válida.
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 07:23.