2011-10-24 27 views
11

Tengo dos tablas. Difieren en que un archivo es una tabla y el otro contiene el registro actual. Estas son las tablas que registran las ventas en la empresa. En ambos tenemos entre otros campos: id, nombre, precio de venta. Necesito seleccionar de ambas tablas, el precio más alto y el más bajo para un nombre de pila. He intentado hacer con la consulta:seleccionar valores max, mín de dos tablas

select name, max (price_of_sale), min (price_of_sale) 
from wapzby 
union 
select name, max (price_of_sale), min (price_of_sale) 
from wpzby 
order by name 

pero tal investigación me atrae dos registros - uno de la tabla actual, un archivo tabla. Quiero elegir un nombre para el precio más pequeño y el más grande inmediatamente de ambas tablas. ¿Cómo obtengo esta consulta?

+2

Qué motor SQL es esto? A mi juicio, te falta un GROUP BY (para agregar MIN y MAX alrededor de cada 'nombre' distinto) y una cláusula WHERE (para restringir a un solo 'nombre'). – pilcrow

Respuesta

1

¿Es esto más como lo que quieres?

SELECT 
    a.name, 
    MAX (a.price_of_sale), 
    MIN (a.price_of_sale) , 
    b.name, 
    MAX (b.price_of_sale), 
    MIN (b.price_of_sale) 
FROM 
    wapzby a, 
    wpzby b 
ORDER BY 
    a.name 

Es no probado, pero debe devolver todos los registros en una fila sin la necesidad de una unión

+0

Si hay cerveza en a, y queso en b ... Él obtendrá una fila en el resultado sobre cerveza y queso. No creo que la unión cartesiana sea lo que él quiere. –

6

En SQL Server se puede utilizar un subquery:

SELECT [name], 
     MAX([price_of_sale]) AS [MAX price_of_sale], 
     MIN([price_of_sale]) AS [MIN price_of_sale] 
FROM (
    SELECT [name], 
      [price_of_sale] 
    FROM [dbo].[wapzby] 
    UNION 
    SELECT [name], 
      [price_of_sale] 
    FROM [dbo].[wpzby] 
) u 
GROUP BY [name] 
ORDER BY [name] 
22

Aquí hay dos opciones (MSSql compatible)

Nota: UNION ALL combinará los conjuntos sin eliminar los duplicados. Es un comportamiento mucho más simple que UNION.

SELECT Name, MAX(Price_Of_Sale) as MaxPrice, MIN(Price_Of_Sale) as MinPrice 
FROM 
(
    SELECT Name, Price_Of_Sale 
    FROM wapzby 
    UNION ALL 
    SELECT Name, Price_Of_Sale 
    FROM wpzby 
) as subQuery 
GROUP BY Name 
ORDER BY Name 

Esta uno se da cuenta de la max y min de cada tabla antes de combinar el conjunto - que puede ser más performant para hacerlo de esta manera.

SELECT Name, MAX(MaxPrice) as MaxPrice, MIN(MinPrice) as MinPrice 
FROM 
(
    SELECT Name, MAX(Price_Of_Sale) as MaxPrice, MIN(Price_Of_Sale) as MinPrice 
    FROM wapzby 
    GROUP BY Name 
    UNION ALL 
    SELECT Name, MAX(Price_Of_Sale) as MaxPrice, MIN(Price_Of_Sale) as MinPrice 
    FROM wpzby 
    GROUP BY Name 
) as subQuery 
GROUP BY Name 
ORDER BY Name 
+0

Gracias - esto es lo que quiero – BKl

1
SELECT MAX(value) FROM tabl1 UNION SELECT MAX(value) FROM tabl2; 
SELECT MIN(value) FROM tabl1 UNION SELECT MIN(value) FROM tabl2; 
+0

Tal vez te ayude si describes lo que hace ese sql y lo formateas para que sea legible. –

Cuestiones relacionadas