2012-05-29 14 views
30

Ich habe eine SELECT-Anfrage mit 'Inner Join' in der Join-Tabelle ist eine Spalte mit Bit-Typ.Holen MAX-Wert einer BIT-Spalte

Ich mag 1 wählen, wenn in der verbundenen Tabelle höchstens einen Wert mit 1 ist, wenn es nicht der Fall ist der Wert 0.

wird also, wenn ich habe:

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

und die zweite Tabelle

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

Ich mag würde Ergebnis haben

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

Ich versuche dies:

SELECT 
    sur.* 
    ,MAX(bo.BOOL)  

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

Aber MAX ist auf BIT-Spalte nicht verfügbar .. So, wie ich das tun kann?

Danke,

+0

Es ist wie Sie, wenn Sie diese _exactly_ verwenden müssen 'SUM' und' GROUP BY' sieht ein Wert sicherstellen möchten, ist 1. – HABO

Antwort

50

Sie es zu einer INT werfen können, und es sogar zu einem BIT zurückgeworfen, wenn Sie

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

Versuchen:

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

Bitte poste nicht nur eine einzelne Codezeile. Erkläre es. -1 – Manishearth

+0

Er wirft es nur als Integer, damit er die maximale Aggregatfunktion verwenden kann. – Jackson

5

Ein Weg, brauchen

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

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

danke! Gibt es einen Unterschied zwischen CAST() und CONVERT()? – bAN

+1

Nein, sie sind gleich, ich möchte einfach besser konvertieren – SQLMenace

0

Wenn Sie nur die Menschen mit wollen genau ein gesetztes Bit:

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