2012-05-29 100 views
30

我有一個SELECT請求,其中'內部連接'在連接表中是一個位類型的列。獲取BIT列的最大值

我要選擇1,如果連接表是用1最多一個值,如果不是這樣的值爲0

所以,如果我有:

PERSID | NAME 
1  | Toto 
2  | Titi 
3  | Tata 

而第二個表

PERSID | BOOL 
1  | 0 
1  | 0 
2  | 0 
2  | 1 

我想有結果

Toto -> 0 
Titi -> 1 
Tata -> 0 

我試試這個:

SELECT 
    sur.* 
    ,MAX(bo.BOOL)  

    FROM SURNAME sur    
    INNER JOIN BOOL bo 
    ON bo.IDPERS = sur.IDPERS 

但是MAX上不可BIT列。我那麼,怎樣才能做到這一點?

感謝,

+0

它看起來像你需要,如果你想確保_exactly_一個值來使用'SUM'和'GROUP BY'爲1 – HABO

回答

50

,你可以將其轉換爲INT,甚至將它轉換回一個BIT如果你需要

SELECT 
    sur.* 
    ,CAST(MAX(CAST(bo.BOOL as INT)) AS BIT) 
    FROM SURNAME sur    
    INNER JOIN BOOL bo 
    ON bo.IDPERS = sur.IDPERS 
8

嘗試:

max(cast(bo.BOOL as int)) 
+3

請不要只發布一行代碼。解釋一下。 -1 – Manishearth

+0

他只是把它作爲一個整數,所以他可以使用最大聚合函數。 – Jackson

5

一種方式

SELECT 
    sur.* 
    ,MAX(convert(tinyint,bo.BOOL))  

    FROM SURNAME sur    
    INNER JOIN BOOL bo 
    ON bo.IDPERS = sur.IDPERS 
+1

謝謝! CAST()和CONVERT()之間有區別嗎? – bAN

+1

不,他們是一樣的,我只是喜歡轉換更好 – SQLMenace

0

如果你想只有那些人究竟一個設置位:

declare @Surname as Table (PersId Int, Name VarChar(10)) 
insert into @Surname (PersId, Name) values 
    (1, 'Toto'), (2, 'Titi'), (3, 'Tata'), (4, 'Tutu') 

declare @Bool as Table (PersId Int, Bool Bit) 
insert into @Bool (PersId, Bool) values 
    (1, 0), (1, 0), 
    (2, 0), (2, 1), 
    (4, 1), (4, 0), (4, 1) 

select Sur.PersId, Sur.Name, Sum(Cast(Bo.Bool as Int)) as [Sum], 
    case Sum(Cast(Bo.Bool as Int)) 
    when 1 then 1 
    else 0 
    end as [Only One] 
    from @Surname as Sur left outer join 
    @Bool as Bo on Bo.PersId = Sur.PersId 
    group by Sur.PersId, Sur.Name 
    order by Sur.Name