2016-07-13 5 views
1

私は、RateとDealの間の関係を格納するテーブル "relation"を持っています。 それは次のようになります。SQLの他の列の値に基づいてブール型列を選択する方法は?

DealId    RateId  IsPremium 
------------------------------------------------ 
    1     A   True 
    2     A   False   
    3     B   False 
    4     B   True 
    5     B   True 
    6     C   False 
    7     C   False 

DealIdは一意であり、1 RateIdは、多くの異なるDealIdにマッピングすることができます。

は今、Buesinessチームは、このテーブルに関するレポートを提供するために私に尋ねたが、この表の同じRateIdが既に値を持っている場合IsPremium値はに変更されます。意味

、要求に基づいて、私の新しいレポートは次のようになります。

DealId    RateId  IsPremium 
------------------------------------------------ 
    1     A   True 
    2     A   True   
    3     B   True 
    4     B   True 
    5     B   True 
    6     C   False 
    7     C   False 

RateId Cは元のテーブルに値を持っていないので、私はFalseの値でそれを示す維持します。

私は私のSQLスクリプトで "グループBY RateId" を使用しようとしましたが、IsPremiumの値を扱うことができない...

答えて

3

一つの方法は、

SELECT DealId, 
     RateId, 
     MAX(IsPremium) OVER (PARTITION BY RateId) AS IsPremium 
FROM YourTable 

Online demo

だろう

(私はカラムがvarcharであると仮定していますが、SQL Serverにはブール型のカラムがないため、 "true"と "false"の文字列を使用します)。

SELECT DealId, 
     RateId, 
     CAST(MAX(CAST(IsPremium AS INT)) OVER (PARTITION BY RateId) AS BIT) AS IsPremium 
FROM YourTable 
1
Solution of Martin work on SGBD with OLAP function (good idea Martin ;) ) 


Solution 2: 
select DealId, RateId, 
case when ispremium =1 then 1 
when (select count(*) from relation f2 where f1.dealid<>f2.dealid and f2.rateid=f1.rateid and ispremium=1)>0 then 1 
else 0 end ispremium 
from relation f1 
1

解決策3:

with maxi as (
select RateId, 
max(cast(ispremium as integer)) ispremium 
from test0713 f1 
group by RateId 
) 
select f1.dealid, f2.* 
from test0713 f1 inner join maxi f2 on f1.RateId=f2.RateId 
関連する問題