SQL - Unir dos consultas

   
Vista:

Unir dos consultas

Publicado por Jorge (17 intervenciones) el 08/09/2017 01:43:57
Hola, Buen día.
Tengo dos consultas y las quiero unir pero no se como

El asunto es el siguiente (BD en Ms-SQLServer 2014):

Tengo una consulta donde hallo el Precio Promedio de la Venta de los productos
de la siguiente manera:

1
2
3
4
SELECT V.Codigo, V.Producto, AVG(V.PU) AS PrecioV
FROM Venta AS V
GROUP BY V.Codigo, V.Producto
ORDER BY V.Codigo

y obtengo como resultado:
1
2
3
4
5
6
--------+-----------+---------
Codigo  | Producto  | PrecioV
--------+-----------+---------
PD00001 | Producto1 |    17.2
PD00004 | Producto4 |    11.8
PD00005 | Producto5 |     4.8

Ahora tengo otra consulta donde hallo el Precio Promedio de la Compra de los productos
de la siguiente manera:

1
2
3
4
SELECT C.Codigo, C.Producto, AVG(C.PU) AS PrecioC
FROM Compra AS C
GROUP BY C.Codigo, C.Producto
ORDER BY C.Codigo

y obtengo como resultado:
1
2
3
4
5
6
--------+-----------+---------
Codigo  | Producto  | PrecioC
--------+-----------+---------
PD00001 | Producto1 |    15.0
PD00004 | Producto4 |    10.0
PD00006 | Producto6 |    13.0

Lo que quisiera obtener es la unión de estas consultas y que me de como resultado
algo así:
1
2
3
4
5
6
7
--------+-----------+---------+---------
Codigo  | Producto  | PrecioV | PrecioC
--------+-----------+---------+---------
PD00001 | Producto1 |    17.2 |    15.0
PD00004 | Producto4 |    11.8 |    10.0
PD00005 | Producto5 |     4.8 |    NULL
PD00006 | Producto6 |    NULL |    13.0


Agradecería su ayuda, porque no se me ocurre como hacerlo...

Seguiré investigando
Gracias.
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

Unir dos consultas

Publicado por leonardo_josue (1142 intervenciones) el 08/09/2017 15:43:27
Hola Jorge:

Para hacer lo que quieres, puedes utilizar un FULL OUTER JOIN... en estos momentos no tengo disponible un servidor de SQL Server para hacer pruebas, pero sería más o menos así:

1
2
3
4
5
6
7
8
9
SELECT * FROM
( SELECT V.Codigo, V.Producto, AVG(V.PU) AS PrecioV
  FROM Venta AS V
  GROUP BY V.Codigo, V.Producto) T1
FULL OUTER JOIN
( SELECT C.Codigo, C.Producto, AVG(C.PU) AS PrecioC
  FROM Compra AS C
  GROUP BY C.Codigo, C.Producto) T2 ON T1.codigo = T2.codigo
ORDER BY T1.Codigo, T2.Codigo

Aquí faltaría "jugar" un poco con los campos en el SELECT para que te regrese exactamente los datos como los necesitas...

Haz la prueba y nos comentas.

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
1
Comentar

Unir dos consultas

Publicado por Jorge (17 intervenciones) el 09/09/2017 01:54:05
GRACIAS! pude solucionarlo con lo que me dijiste,
al mostrar todas las columnas

1
2
3
4
5
6
7
8
9
SELECT * FROM
( SELECT V.Codigo, V.Producto, AVG(V.PU) AS PrecioV
  FROM Venta AS V
  GROUP BY V.Codigo, V.Producto) T1
FULL OUTER JOIN
( SELECT C.Codigo, C.Producto, AVG(C.PU) AS PrecioC
  FROM Compra AS C
  GROUP BY C.Codigo, C.Producto) T2 ON T1.codigo = T2.codigo
ORDER BY T1.Codigo, T2.Codigo

Da como resultado:

1
2
3
4
5
6
7
--------+-----------+---------+--------+-----------+---------
Codigo  | Producto  | PrecioV |Codigo  | Producto  | PrecioC
--------+-----------+---------+--------+-----------+---------
PD00001 | Producto1 |    17.2 |PD00001 | Producto1 |    15.0
PD00004 | Producto4 |    11.8 |PD00004 | Producto4 |    10.0
PD00005 | Producto5 |     4.8 |   NULL |      NULL |    NULL
   NULL |      NULL |    NULL |PD00006 | Producto6 |    13.0

Ahora uniendo las columnas en común:

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
  CASE WHEN T1.Codigo IS NULL THEN T2.Codigo ELSE T1.Codigo END AS Codigo,
  CASE WHEN T1.Producto IS NULL THEN T2.Producto ELSE T1.Producto END AS Producto,
  T1.PrecioV, T2.PrecioC
FROM
  ( SELECT V.Codigo, V.Producto, AVG(V.PU) AS PrecioV
    FROM Venta AS V
    GROUP BY V.Codigo, V.Producto) T1
  FULL OUTER JOIN
  ( SELECT C.Codigo, C.Producto, AVG(C.PU) AS PrecioC
    FROM Compra AS C
    GROUP BY C.Codigo, C.Producto) T2 ON T1.codigo = T2.codigo
ORDER BY 1, 2

Queda como resultado:

1
2
3
4
5
6
7
--------+-----------+---------+---------
Codigo  | Producto  | PrecioV | PrecioC
--------+-----------+---------+---------
PD00001 | Producto1 |    17.2 |    15.0
PD00004 | Producto4 |    11.8 |    10.0
PD00005 | Producto5 |     4.8 |    NULL
PD00006 | Producto6 |    NULL |    13.0

Gracias, yo estaba pensando hacer una vista y luego hacer la consulta de la vista, pero así con el FULL OUTER JOIN me sale a la primera.
Gracias.
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
Revisar política de publicidad