web-dev-qa-db-fra.com

Obtenez la valeur MAX d'une colonne BIT

J'ai une demande SELECT avec "jointure interne" dans la table jointe est une colonne de type bit.

Je veux sélectionner 1 si dans la table jointe est au plus une valeur avec 1. Si ce n'est pas le cas, la valeur sera 0.

Donc, si j'ai:

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

Et la deuxième table

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

J'aimerais avoir pour résultat

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

J'essaye ceci:

SELECT 
     sur.*
    ,MAX(bo.BOOL)    

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

Mais MAX n'est pas disponible sur la colonne BIT .. Alors, comment puis-je faire cela?

Merci,

45
bAN

vous pouvez le convertir en INT, et même le rediffuser en BIT si vous en avez besoin

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

Essayer:

max(cast(bo.BOOL as int))
11
Andomar

Une manière

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

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

Vous pouvez éviter la double distribution en désordre en forçant une distribution implicite:

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

Si vous ne voulez que les personnes avec exactement un bit défini:

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
1
HABO