2012-05-29 38 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