Maximale waarde van een BIT-kolom ophalen

Ik heb een SELECT-verzoek met ‘inner join’ in de samengevoegde tabel is een kolom met bittype.

Ik wil 1 selecteren als in de samengevoegde tabel maximaal één waarde met 1 is. Als dit niet het geval is, wordt de waarde 0.

Dus als ik heb:

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

En de tweede tafel

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

Ik zou graag willen hebben voor resultaat

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

Ik probeer dit:

SELECT 
     sur.*
    ,MAX(bo.BOOL)    
    FROM SURNAME sur              
    INNER JOIN BOOL bo
    ON bo.IDPERS = sur.IDPERS

Maar MAX is niet beschikbaar in de BIT-kolom. Dus hoe kan ik dat doen?

Bedankt,


Antwoord 1, autoriteit 100%

je kunt het casten naar een INT, en zelfs terug casten naar een BITals dat nodig is

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

Antwoord 2, autoriteit 20%

Probeer:

max(cast(bo.BOOL as int))

Antwoord 3, autoriteit 8%

Enkele reis

SELECT 
     sur.*
    ,MAX(convert(tinyint,bo.BOOL))    
    FROM SURNAME sur              
    INNER JOIN BOOL bo
    ON bo.IDPERS = sur.IDPERS

Antwoord 4, autoriteit 7%

Je kunt de rommelig ogende dubbele cast vermijden door een impliciete cast te forceren:

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

Antwoord 5

Als je alleen die mensen wilt met precieséén 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

Other episodes