2016-09-13 4 views
0

私はここで、テーブルを持っていますポイントを見てリワードフィールド。報酬ポイント、既に作成されたフィールドを見て、

すでに最初のテーブルが作成されています.2つの新しいフィールド、つまり金と銀のフィールドを持つ新しいテーブルが必要です。

私は出力がこのような何かになりたい:クエリで私を助けたり、私に続行する方法についていくつかの提案を教えてください enter image description here

ありがとうございます。

答えて

1

は、私はあなたがこのためにdense_rank()を使用したいと思う:

select t.*, 
     (case when rnk = 1 then 1 else 0 end) as gold, 
     (case when rnk = 2 then 1 else 0 end) as silver 
from (select t.*, 
      dense_rank() over (partition by week order by pointsrewarded) as rnk 
     from t 
    ) t; 

dense_rank()が結びつきがある場合を処理します。その場合、複数の「金」と「銀」の値が割り当てられます。

サブクエリは必要ありません。外部クエリでdense_rank()を繰り返すことができます。私はちょうどこの方法でロジックを実行する方が簡単だと思います。

+0

真の天才です!! –

+0

元のテーブルにハードコードされたrnk、gold、およびsilverフィールドを作成するにはどうすればいいですか?つまり、クエリの結果が最初のテーブル.Plzは –

0

ポイント還元された降順で注文するようにしてください。最初の場所は最高点であり、最も低い点ではありません。私のコードは長いですが、私は読むのがより簡単です(個人的な好み)。

--create table employee (employeeid int, employeename varchar(50), weeknumber int, pointsRewarded int, Hours int) 
--insert into employee values (111, 'person1', 1, 400, 2) 
--insert into employee values (112, 'person2', 1, 100, 10) 
--insert into employee values (113, 'person3', 1, 200, 10) 
--insert into employee values (111, 'person1', 2, 100, 2) 
--insert into employee values (112, 'person2', 2, 50, 10) 
--insert into employee values (113, 'person3', 2, 200, 10) 
--insert into employee values (111, 'person1', 3, 20, 4) 
--insert into employee values (112, 'person2', 3, 25, 5) 
--insert into employee values (113, 'person3', 3, 100, 6) 

;WITH Medals AS 
(
    SELECT 
     employeeid 
     ,employeename 
     ,weeknumber 
     ,pointsRewarded 
     ,hours 
     ,ROW_NUMBER() OVER (PARTITION BY weeknumber ORDER BY pointsrewarded DESC) medal 
    FROM 
     employee 
) 
SELECT 
     employeeid 
     ,employeename 
     ,weeknumber 
     ,pointsRewarded 
     ,hours 
     ,CASE WHEN medal = 1 THEN 1 ELSE 0 END AS gold 
     ,CASE WHEN medal = 2 THEN 1 ELSE 0 END AS silver 
FROM  
    Medals 
+0

と似ています。 –

関連する問題