web-dev-qa-db-ja.com

2つのテーブルから最大値、最小値を選択する

テーブルが2つあります。アーカイブはテーブルであり、もう1つは現在のレコードを保持している点が異なります。これらは、会社の売上を記録するテーブルです。どちらにも、ID、名前、販売価格などのフィールドがあります。両方のテーブルから、名前の最高値と最低値を選択する必要があります。私はクエリでやろうとしました:

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

しかし、そのような問い合わせは2つのレコードを引き出します-現在のテーブルの1つと1つのテーブルのアーカイブ。両方のテーブルからすぐに最小価格と最大価格の名前を選択したいと思います。このクエリを取得するにはどうすればよいですか?

11
BKl

2つのオプションがあります(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
26
Amy B

SQL Serverでは 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]
7
Tom Hunter

これはあなたが望むものに似ていますか?

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 

テストされていませんが、ユニオンを必要とせずにすべてのレコードを1行で返す必要があります

2
Purplegoldfish
SELECT MAX(value) FROM tabl1 UNION SELECT MAX(value) FROM tabl2;
SELECT MIN(value) FROM tabl1 UNION SELECT MIN(value) FROM tabl2;
1