4

私はこのようなテーブルを持っていますitem_table

item   age
--------------    
1      1 
1      6 
2      2    

私はこのような他のテーブルを持っていますprice_table

item    pricetype    price
--------------------------    
1       O             5
1       P             6
1       V             7
2       O             8
2       P             9
2       V             10

したがって、2つのテーブルの上で内部結合したいと思います。

select *
from item_table i
inner join price_table p
on ...

についていくつかの条件がありますon

  1. アイテムの平均年齢がよりも大きい場合は、次の3ようにします。inner join price_table on pricetype = 'O' or pricetype = 'P'
  2. そうでない場合、私はします:inner join price_table on pricetype = 'O' or pricetype = 'P' or pricetype = 'V'

したがって、条件には条件がありonます。

次に、次のようにクエリを記述します。

select i.item, i.type, p.pricetype, p.price
from item_table i
inner join price_table p on i.item = p.item 
    and (avg(i.age) >= 3 and p.pricetype in ('O', 'P'))
        or (avg(i.age) < 3 and p.pricetype in ('O', 'P', 'V'))

エラーが発生します:An aggregate cannot appear in an ON clause unless it is in a subquery contained in a HAVING clause or select list, and the column being aggregated is an outer reference.

他の条件はに依存しているため、avgに移動できません。Havingavg

選択クエリを作成するにはどうすればよいですか?

4

2 に答える 2

6
select *
from (
    select item, avg(age) as AvgAge
    from item_table
    group by item
) ia
inner join price_table p on ia.item = p.item 
    and ((ia.AvgAge >= 3 and p.pricetype in ('O', 'P'))
        or (ia.AvgAge < 3 and p.pricetype in ('O', 'P', 'V')))

SQLフィドルの例1

これは次のように簡略化できます。

select *
from (
    select item, avg(age) as AvgAge
    from item_table
    group by item
) ia
inner join price_table p on ia.item = p.item 
    and (p.pricetype in ('O', 'P')
        or (ia.AvgAge < 3 and p.pricetype = 'V'))

SQLフィドルの例2

于 2012-11-06T15:54:01.803 に答える
1

集計をサブクエリに配置しようとしましたか?次に、句avg()で使用する値があります。JOIN

select i.item, i.type, p.pricetype, p.price
from
(
    select avg(i.age) age, i.item, i.type  -- not sure where type is coming from in your OP as it is not in the table you showed
    from item_table i
    group by i.item, i.type
)   i
inner join price_table p 
    on i.item = p.item 
    and ((i.age>= 3 and p.pricetype in ('O', 'P'))
        or (i.age < 3 and p.pricetype in ('O', 'P', 'V')))
于 2012-11-06T15:49:39.110 に答える