Obțineți valoarea MAX a unei coloane BIT

Am o cerere SELECT cu "intrare internă" în tabelul îmbinat este o coloană cu tip de biți.

Vreau să selectez 1 dacă în tabelul îmbinat este cel mult o valoare cu 1. Dacă nu este cazul, valoarea va fi 0.

Deci, dacă am:

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

Și al doilea tabel

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

Aș vrea să am rezultate

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

Încerc acest lucru:

SELECT 
     sur.*
    ,MAX(bo.BOOL)    

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

Dar MAX nu este disponibil pe coloana BIT .. Cum pot face asta?

Mulțumiri,

0
Se pare că trebuie să utilizați SUM și GROUP BY dacă doriți să vă asigurați că exact o valoare este 1.
adăugat autor HABO, sursa

4 răspunsuri

puteți să-l aruncați într-un INT și chiar să îl aruncați într-un BIT dacă aveți nevoie să

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

Dacă doriți doar acele persoane care au exact un bit set:

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
0
adăugat

Încerca:

max(cast(bo.BOOL as int))
0
adăugat
El doar o aruncă ca un număr întreg, astfel încât să poată utiliza funcția agregată maximă.
adăugat autor Jackson, sursa
Nu scrieți doar o singură linie de cod. Expică. -1
adăugat autor Manishearth, sursa

Într-un fel

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

    FROM SURNAME sur              
    INNER JOIN BOOL bo
    ON bo.IDPERS = sur.IDPERS
0
adăugat
Mulțumiri! Există o diferență între CAST() și CONVERT ()?
adăugat autor bAN, sursa
Nu sunt aceleași, îmi place să convertesc mai bine
adăugat autor SQLMenace, sursa