2012-01-09 19 views
1

テーブルSalesのフィールドは、code, amount, index, nameです。SQLクエリの最大値と最小値

nameの場合は、最小値と最大値をそれぞれamount、最小値と最大値の値をそれぞれcodeとする必要があります。

誰かが質問の作成に手伝ってもらえますか?

+0

このPostgreSQLのですか? –

+0

いいえ、それはFoxbaseです。私はクエリを持っています:セレクトz1からコードを選択してください。セールスz3からのamount =(セールスz2のz2.name = z3.name)からのselect max)それは 'エラー相関フィールド'メッセージを表示しています – BKl

+0

@BKl:待って、Foxbase、'80年代のXベースのクローン?または、他の何か?あなたは明確にしてもらえますか? – Charles

答えて

2

名あたりの最小値と最大量を見つけるために:CTEとROW_NUMBER()が利用可能な場合は

select * 
from sales s 
where 
     (amount = (select 
        max(s1.amount) 
       from sales s1 
       where s1.name = s.name) 
     or 
     amount = (select 
        min(s2.amount) 
       from sales s2 
       where s2.name = s.name) 
     ) 
+0

大丈夫ですが、私は1つのクエリでそれをしたいと、すべてのフィールド '名前'のために私はそれにどのように参加することができますか教えてください?私は外部結合を使用しようとしましたが、それは私にとってはうまく機能しませんでした – BKl

+0

'name'のすべての値が必要な場合は、 'name = 'given_name''の条件を安全に削除できます。 –

+0

@BKl 'name'のすべての値に対してクエリを追加しますか? –

4

select 
    name 
    min(amount), max(amount) 
from 
    sales 
group by name 

をして(minとmax)の両方を取得すると、単一のクエリ内のコードあなたへ。

次のことを試して、これはPostgresのであると仮定すると、
with S as 
(
    select Amount, 
     Code, 
     row_number() over(order by Amount asc) as rn1, 
     row_number() over(order by Amount desc) as rn2 
    from Sales 
    where Name = 'SomeName'  
) 
select SMin.Amount as MinAmount, 
     SMin.Code as MinCode, 
     SMax.Amount as MaxAmount, 
     SMax.Code as MaxCode 
from S as SMin 
    cross join S as SMax 
where SMin.rn1 = 1 and 
     SMax.rn2 = 1 
1

select name, 
     amount, 
     code, 
     case when min_rank=max_rank then 'Minimum and Maximum' 
      when min_rank=1 then 'Minimum' 
      else 'Maximum' 
     end as min_or_max 
from 
(select s.*, 
     rank() over (partition by name order by amount) min_rank, 
     rank() over (partition by name order by amount desc) max_rank 
from sales s) v 
where 1 in (min_rank, max_rank)