Выберите max, min значения из двух таблиц

У меня две таблицы. Отличается тем, что архив является таблицей, а другой содержит текущую запись. Это таблицы, отражающие продажи в компании. У нас есть и другие поля: id, name, price of sale. Мне нужно выбрать из обеих таблиц, самую высокую и самую низкую цену за данное имя. Я попытался выполнить запрос:

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

но такой запрос привлекает мне две записи - одну из текущей таблицы, одну таблицу архива. Я хочу выбрать имя для самой маленькой и самой большой цены сразу из обеих таблиц. Как получить этот запрос?

Ответ 1

Здесь два варианта (совместимый с MSSql)

Примечание. UNION ALL объединяет наборы без исключения дубликатов. Это гораздо более простое поведение, чем 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

Этот показатель показывает максимальную и минимальную значения из каждой таблицы перед объединением набора - это может быть более эффективным, чтобы сделать это таким образом.

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

Ответ 2

В SQL Server вы можете использовать подзапрос:

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]

Ответ 3

Это больше похоже на то, что вы хотите?

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 

Он непроверен, но должен возвращать все ваши записи в одну строку без необходимости объединения

Ответ 4

SELECT MAX(value) FROM tabl1 UNION SELECT MAX(value) FROM tabl2;
SELECT MIN(value) FROM tabl1 UNION SELECT MIN(value) FROM tabl2;