Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   SELECT para encontrar registros con diferentes valores en el mismo campo (https://www.clubdelphi.com/foros/showthread.php?t=86878)

gustavosv 19-05-2012 18:55:58

Consultar el mismo campo varios valores
 
Hola a todos, quiero pedirles su ayuda, tengo dos tablas, una padre y su hija (pedidos y detalle de pedidos), necesito con SQL consultar cuáles pedidos tienen la condición de estar requiriendo dos o más productos de códigos específicos. Me explico mejor con un ejemplo:

Cita:

Pedido DetPedido
------- -----------------------
pedIdPed dpdIdPed dpdIdProducto
101 101 gafas
101 101 camiseta

102 102 gafas
102 102 gorra
102 102 pantaloneta

103 103 camiseta
103 103 medias
103 103 gafas
Código SQL [-]
SELECT pedIdPed 
FROM Pedido, DetPedido
WHERE pedIdPed = pdpIdPed AND (dpdIdProducto = 'gafas' AND dpdIdProducto = 'camiseta')
Al hacerlo así no me devuelve filas, cuando cambio AND por OR en la pregunta del producto, me devuelve todas las filas, pero necesito es que el resultado de esa consulta sea: 101 y 103

Alguna idea ...

Gracias

champy 20-05-2012 01:37:39

No estoy muy seguro de entender la pregunta.

Lo que tu quieres es encontrar el número de pedido que contiene TODOS los artículos que pasas en la condición?

Es decir... Dame aquel Nº de pedido en el que se están pidiendo unas gafas y tambien se está pidiendo una camiseta.

¿Es esa la idea? ¿Qué tal algo como esto?

Código SQL [-]
SELECT DetPedido.pedIdPed 
FROM DetPedido INNER JOIN DetPedido Detpedido2 on (DetPedido.pedIdPed=DetPedido2.pedIdPed)
WHERE 
        pedIdPed.dpdIdProducto   = 'gafas' 
AND  pedIdPed2.dpdIdProducto = 'camiseta'

No estoy 100% seguro de que la manera de enlazar la tabla consigo misma sea correcta, que alguien me corrija si no es así =)

gustavosv 17-10-2014 01:08:53

SELECT para encontrar registros con diferentes valores en el mismo campo
 
Hola, para empezar, no se si el título realmente describa mi inquietud, pero bueno ...

Tengo una tabla que contiene el detalle de los pedidos con una estructura Consecutivo, NroPedido, IdProducto, Cantidad, ... un Pedido puede tener diferentes productos:

Consecutivo NroPedido IdProducto Cantidad
1 101 TORNILLO 1
2 101 TUERCA 2
3 101 BUJE 1

4 102 TUERCA 1
5 102 BOMBILLO 1

6 103 TORNILLO 5
7 103 BUJE 3
8 103 ARANDELA 5

Necesito encontrar los pedidos que contengan p.ej: TORNILLO Y TUERCA, es decir el 101

Cómo se construye ese SELECT ...?

Gracias !

dec 17-10-2014 01:48:43

Hola,

No soy el más indicado, pero, ¿algo así es lo que estás buscando?

Código SQL [-]
SELECT * FROM NombreTabla WHERE (NroPedido = 101)

gustavosv 17-10-2014 01:59:33

Hola dec, no me serviría porque necesito preguntar por el Producto, es decir no conozco cuales Pedidos tienen los 2 productos (de acuerdo al ejemplo).

Había intentado lo siguiente:
Código SQL [-]
SELECT * FROM NombreTabla
WHERE (IdProducto = 'TORNILLO') OR (IdProducto = 'TUERCA')

pero evidentemente el resultado son los Pedidos que tienen el Producto TORNILLO 'o' el Producto TUERCA, según el ejemplo serían el 101, 102 y 103, y lo que necesito son los Pedidos que tienen AMBOS Productos, el 101.

Ahora, si en lugar de OR utilizo AND, siempre será un resultado vacio ya que ningún Producto podría llamarse al mismo tiempo TORNILLO Y TUERCA.

FGarcia 17-10-2014 02:39:14

Menos indicado yo!!! :D:D:D:D

Código:

SELECT * FROM NombreTabla
WHERE (IdProducto = 'TORNILLO') AND (IdProducto = 'TUERCA')
GROUP BY NroPedido


roman 17-10-2014 06:09:04

Se me ocurre esto, pero no sé si sirva:

Código SQL [-]
select NroPedido from pedidos p
where
  'Tornillo' in (select distinct IdProducto from pedidos q where q.NroPedido = p.NroPedido) and
  'Tuerca' in (select distinct IdProducto from pedidos q where q.NroPedido = p.NroPedido)

// Saludos

ecfisa 17-10-2014 06:22:12

Hola gustavosv.

Otra opción:
Código SQL [-]
SELECT T1.NROPEDIDO
FROM TABLA T1
WHERE T1.IDPRODUCTO = :IDPROD1
AND EXISTS (SELECT IDPRODUCTO FROM TEST T2
            WHERE T2.NROPEDIDO = T1.NROPEDIDO AND T2.IDPRODUCTO = :IDPROD2)

Saludos :)

orodriguezca 17-10-2014 14:56:11

Usando Having
 
Creo que esto funcionaría :

Código SQL [-]
select R1.NROPEDIDO
  from DETPEDIDO R1
  where R1.IDPRODUCTO in ('TORNILLO', 'TUERCA')
  group by R1.NROPEDIDO
  having Count(*) >= 2; -- 2 es elnumero de diferentes idProducto buscados

También se me ocurrió esto otro, que es un poco más rebuscado, pero en ciertas situaciones puede darnos algo de flexibilidad adicional, siempre y cuando nuestro motor de bases de datos pueda realizar consultas CTE (common-table-expresion) (por lo menos Firebird, Sql Server y db2 pueden):

Código SQL [-]
with R1 as (
  select NROPEDIDO
    from DETPEDIDO 
    where IDPRODUCTO = 'TORNILLO'),
R2 as (
  select NROPEDIDO
     from DETPEDIDO
     where IDPRODUCTO = 'TUERCA'
)
select R1.NROPEDIDO
  from R1
  inner join R2
      on R1.NROPEDIDO = R2.NROPEDIDO;

gustavosv 17-10-2014 17:06:50

LISTO !!! :):)

Muchas gracias a todos por sus respuestas y mis respetos.

Me funcionaron perfecto las ideas de Roman y Ecfisa, la una va más rápido que la otra pero se obtiene el mismo resultado correcto, la primera de Orodriguezca la probé y no me funcionó ya que el resultado es como si usara mi opción de OR, bueno en últimas para eso es IN, y la segunda no trabajó en MySQL.

De nuevo gracias por su ayuda !

GustavoSV

ecfisa 17-10-2014 18:20:42

Hola gustavosv.

Habías publicado dos hilos con el mismo contenido. Para evitar dispersar resultados en las búsquedas, combiné ambos en este.

Si ves que tu hilo inicial no ha tenido respuestas no crees otro tema, publica un nuevo mensaje en el original y pasará a encabezar la lista nuevamente.

Saludos :)

gustavosv 17-10-2014 19:21:59

Listo, tienes razón, gracias !

Solo que el anterior hilo lo había puesto hace más de 2 años y la verdad no me acordaba de él. :o

ecfisa 17-10-2014 22:34:35

Cita:

Empezado por gustavosv (Mensaje 483267)
Listo, tienes razón, gracias !

Solo que el anterior hilo lo había puesto hace más de 2 años y la verdad no me acordaba de él. :o

El detalle de la fecha se me pasó... :D

Saludos :)


La franja horaria es GMT +2. Ahora son las 07:34:16.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi