SQL - unir dos subconsultas en sql

   
Vista:

unir dos subconsultas en sql

Publicado por diego (3 intervenciones) el 17/05/2010 06:43:08
hola necesito saber como unir dos subconsultas

. Una lista con la cantidad de pedidos con descuento y sin descuento, agrupados por el semestre de cada año

esta entrega, los semestres con descuento y la cantidad de pedidos por año:

SELECT semestres.Semestre AS Semestre,
COUNT( DISTINCT semestres.IdPedido) AS pedidos
FROM detalles_de_pedidos AS detalle,
(SELECT detalles_de_pedidos.IdPedido AS IdPedido ,
CONCAT( IF( Month(pedidos.FechaPedido) <= 6 , "01-", "02-"),
Year(pedidos.FechaPedido)) AS Semestre
FROM pedidos, detalles_de_pedidos
WHERE detalles_de_pedidos.IdPedido = pedidos.IdPedido
AND detalles_de_pedidos.Descuento <> 0
) AS semestres
WHERE detalle.IdPedido = semestres.IdPedido
GROUP BY semestres.Semestre;

esta entrega, los semestres sin descuento y la cantidad de pedidos por año:

SELECT semestres.Semestre AS Semestre,
COUNT( DISTINCT semestres.IdPedido) AS pedidos
FROM detalles_de_pedidos AS detalle,
(SELECT detalles_de_pedidos.IdPedido AS IdPedido ,
CONCAT( IF( Month(pedidos.FechaPedido) <= 6 , "01-", "02-"),
Year(pedidos.FechaPedido)) AS Semestre
FROM pedidos, detalles_de_pedidos
WHERE detalles_de_pedidos.IdPedido = pedidos.IdPedido
AND detalles_de_pedidos.Descuento =0
) AS semestres
WHERE detalle.IdPedido = semestres.IdPedido
GROUP BY semestres.Semestre;

¿Cómo hago para unir ambas subconsultas y obtener los resultados en una sola tabla???
gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:unir dos subconsultas en sql

Publicado por Leonardo Josue (880 intervenciones) el 17/05/2010 17:13:12
Buenos días Diego:

Puedes hacer uso de la Cláusula UNION, la cual te permite unir dos o más subconsultas en una tabla, sin embargo, estoy revisando tus consultas y veo que el origen de tus datos son las mismas tablas, y que la única diferencia es justamente la referente al campo detalles_de_pedidos.Descuento.
En tus consultas tienes las siguientes condiciones

detalles_de_pedidos.Descuento <> 0
detalles_de_pedidos.Descuento = 0

Entonces podrías ahorrarte la unión y hacerlo en un solo Query de la siguiente manera:

SELECT semestres.Semestre AS Semestre,
COUNT( DISTINCT semestres.IdPedido) AS pedidos
FROM detalles_de_pedidos AS detalle,
(SELECT detalles_de_pedidos.IdPedido AS IdPedido ,
CONCAT( IF( Month(pedidos.FechaPedido) <= 6 , "01-", "02-"),
Year(pedidos.FechaPedido)) AS Semestre
FROM pedidos, detalles_de_pedidos
WHERE detalles_de_pedidos.IdPedido = pedidos.IdPedido
AND
(detalles_de_pedidos.Descuento <> 0 OR
detalles_de_pedidos.Descuento = 0 )
) AS semestres
WHERE detalle.IdPedido = semestres.IdPedido
GROUP BY semestres.Semestre;

Aun más, si tu campo detalles_de_pedidos.Descuento no acepta valores nulos entonces la unión entre estas condiciones

detalles_de_pedidos.Descuento <> 0
detalles_de_pedidos.Descuento = 0

te dá el universo, es decir, el campo sólo puede cero o diferente de cero. Si este es el caso entonces podrías incluso eliminar esta condición.

SELECT semestres.Semestre AS Semestre,
COUNT( DISTINCT semestres.IdPedido) AS pedidos
FROM detalles_de_pedidos AS detalle,
(SELECT detalles_de_pedidos.IdPedido AS IdPedido ,
CONCAT( IF( Month(pedidos.FechaPedido) <= 6 , "01-", "02-"),
Year(pedidos.FechaPedido)) AS Semestre
FROM pedidos, detalles_de_pedidos
WHERE detalles_de_pedidos.IdPedido = pedidos.IdPedido
) AS semestres
WHERE detalle.IdPedido = semestres.IdPedido
GROUP BY semestres.Semestre;

Puedes agregar la cláusula ORDER BY para ordenar tu información.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:unir dos subconsultas en sql

Publicado por diego (3 intervenciones) el 17/05/2010 19:07:52
Muchas gracias leo me ha sido muy útil tu respuesta

pero aún tengo una duda con el UNION:

La primera consulta me entrega esto:
Semestre_sin_descuento pedidos_sin_descuento
01-1997 133
01-1998 203
02-1996 120
02-1997 157

la segunda consulta me entrega esto:

Semestre_con_descuento pedidos_con_descuento
01-1997 92
01-1998 117
02-1996 66
02-1997 105

Pero al hacer UNION me entrega esto:

Semestre_sin_descuento pedidos_sin_descuento
01-1997 133
01-1998 203
02-1996 120
02-1997 157
01-1997 92
01-1998 117
02-1996 66
02-1997 105

Y lo que yo necesito es que me separe por pedidos sin descuento y pedidos con descuento en la tabla resultante, algo así:
Semestre_sin_descuento pedidos_sin_descuento pedidos_con_descuento
01-1997 133 92
01-1998 203 117
02-1996 120 66
02-1997 157 105

ojalá es entienda y gracias de antemano
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:unir dos subconsultas en sql

Publicado por Leonardo Josue (880 intervenciones) el 17/05/2010 20:45:21
Hola de nuevo diego...

ahora que pusiste los datos de tus tablas y la salida queda más entendible que es lo que necesitas. No sé con que manejador de BD estés trabajando, pero puedes intentar hacer esto a ver si es que te lo permite:

select X.*, Y.pedidos from (
SELECT semestres.Semestre AS Semestre,
COUNT( DISTINCT semestres.IdPedido) AS pedidos
FROM detalles_de_pedidos AS detalle,
(SELECT detalles_de_pedidos.IdPedido AS IdPedido ,
CONCAT( IF( Month(pedidos.FechaPedido) <= 6 , "01-", "02-"),
Year(pedidos.FechaPedido)) AS Semestre
FROM pedidos, detalles_de_pedidos
WHERE detalles_de_pedidos.IdPedido = pedidos.IdPedido
AND detalles_de_pedidos.Descuento <> 0
) AS semestres
WHERE detalle.IdPedido = semestres.IdPedido
GROUP BY semestres.Semestre
) X INNER JOIN
(
SELECT semestres.Semestre AS Semestre,
COUNT( DISTINCT semestres.IdPedido) AS pedidos
FROM detalles_de_pedidos AS detalle,
(SELECT detalles_de_pedidos.IdPedido AS IdPedido ,
CONCAT( IF( Month(pedidos.FechaPedido) <= 6 , "01-", "02-"),
Year(pedidos.FechaPedido)) AS Semestre
FROM pedidos, detalles_de_pedidos
WHERE detalles_de_pedidos.IdPedido = pedidos.IdPedido
AND detalles_de_pedidos.Descuento =0
) AS semestres
WHERE detalle.IdPedido = semestres.IdPedido
GROUP BY semestres.Semestre
) Y ON X.Semestre = Y.Semestre

Si la consulta no funciona dime con qué manejador de BD estás trabajando para tratar de encontrar una sintaxis compatible.

saludos.
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:unir dos subconsultas en sql

Publicado por diego (3 intervenciones) el 17/05/2010 22:54:59
Muchísimas gracias Leo por tu tiempo, me ha sido de mucha ayuda tu respuesta.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar