2012-05-29 19 views
30

Ho una richiesta SELECT con 'inner join' nella tabella unita è una colonna con tipo di bit.Ottieni il valore MAX di una colonna BIT

voglio selezionare 1 se nella tabella unita è al massimo un valore di 1. Se non è il caso il valore sarà 0.

Quindi, se ho:

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

e la seconda tabella

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

vorrei avere per risultato

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

provo questo:

SELECT 
    sur.* 
    ,MAX(bo.BOOL)  

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

ma Max non è disponibile sulla colonna di bit .. Così come posso farlo?

Grazie,

+0

Sembra che avete bisogno di usare '' SUM' e GROUP BY' se si vuole garantire che _esattamente_ un valore è 1. – HABO

risposta

50

si può lanciare a un INT, e anche il cast di nuovo ad un BIT se avete bisogno di

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

Prova:

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

Si prega di non pubblicare solo una singola riga di codice. Spiegalo. -1 – Manishearth

+0

L'ha appena lanciato come numero intero, quindi può utilizzare la massima funzione di aggregazione. – Jackson

5

Un modo

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

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

grazie! C'è una differenza tra CAST() e CONVERT()? – bAN

+1

No sono uguali, mi piace convertire meglio – SQLMenace

0

Se si desidera che solo le persone con esattamente un set 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 
Problemi correlati