2016-10-10 20 views
2

SQL Server 2008で1対多の結合が残っており、クエリに割り当てられた優先度に基づいて行を返す必要があります。ランク付けに基づくSQL Server戻り値の結果

私のテーブルでは、これらのvarcharフィールドはアルファベット順に並べることができないので、私は必要とします。それぞれに数値を割り当てます。

Table1 
Station 1 
Station 2 
Station 3 


Table2 
Station 1 User 1 A 
Station 1 User 2 B 
Station 1 User 3 A 
Station 1 User 4 B 
Station 1 User 5 B 
Station 2 User 1 B 
Station 2 User 2 F 
Station 2 User 3 D 
Station 2 User 4 S 
Station 2 User 5 E 
Station 3 User 1 D 
Station 3 User 2 D 
Station 3 User 3 D 
Station 3 User 4 S 
Station 3 User 5 C 

私は以下の結果を返すしたいと思います:

Station 1 A 
Station 2 B 
Station 3 C 

すなわちAがステーション1のために最も重要であるが、B等ステーション2用

私のロジックは、これまでにありケースを使用し、文を選択してください:

select t1.station 
, min(
case 
    when A then 1 
    when B then 2 
    when C then 3 
    when D then 4 
end 
) 
from table1.t1 left join table2.t2 on t1.station = t2.station 
group by t1.station 

しかし、私は結合で複数の行を返すので、私は分かりませんどのようにこれに対処するには、私も割り当てられた優先順位ではなく、文字列を返したいと思います。私はあなたがROW_NUMBER機能のORDER BY句でCASE表現を使用することができます事前に感謝

+0

あなたが供給している詳細と参加する必要はありませんように私は、これまで以上ありますと仮定します。 ..)駅からt2グループから: – Phylogenesis

+0

@Phylogenesis、はい私は(試して)いくつかの明快さを与えるためにそれをトリミング – User632716

答えて

4

、この上でいくつかの助けに感謝したい:

select station, mycol 
from (
    select t1.station, t2.mycol, 
      ROW_NUMBER() OVER (PARTITION BY t1.station 
          ORDER BY CASE t2.mycol 
             WHEN A THEN 1 
             WHEN B THEN 2 
             WHEN C THEN 3 
             WHEN D THEN 4 
             end) AS rn 
    from table1.t1 
    left join table2.t2 on t1.station = t2.station) as t 
where t.rn = 1 

問合せは、各内最大の優先順位を持つレコードを選択しますt1.stationパーティション。それ以外のフィールドはtable2から返されます。

+0

迅速な応答のおかげで、私はそれは 'ケース'の間のt2.mycolを逃すと思うが、これは間違いなく右のトラックに私を設定 - 多くの感謝! – User632716