Ответ 1
вы можете направить его на INT
и даже вернуть его к BIT
, если вам нужно
SELECT
sur.*
,CAST(MAX(CAST(bo.BOOL as INT)) AS BIT)
FROM SURNAME sur
INNER JOIN BOOL bo
ON bo.IDPERS = sur.IDPERS
У меня есть запрос SELECT с "внутренним соединением" в объединенной таблице - это столбец с типом бит.
Я хочу выбрать 1, если в объединенной таблице не более одного значения с 1. Если это не так, значение будет 0.
Итак, если у меня есть:
PERSID | NAME
1 | Toto
2 | Titi
3 | Tata
И вторая таблица
PERSID | BOOL
1 | 0
1 | 0
2 | 0
2 | 1
Я хотел бы получить результат
Toto -> 0
Titi -> 1
Tata -> 0
Я пробую это:
SELECT
sur.*
,MAX(bo.BOOL)
FROM SURNAME sur
INNER JOIN BOOL bo
ON bo.IDPERS = sur.IDPERS
Но MAX недоступен в столбце BIT. Итак, как я могу это сделать?
Спасибо,
вы можете направить его на INT
и даже вернуть его к BIT
, если вам нужно
SELECT
sur.*
,CAST(MAX(CAST(bo.BOOL as INT)) AS BIT)
FROM SURNAME sur
INNER JOIN BOOL bo
ON bo.IDPERS = sur.IDPERS
Try:
max(cast(bo.BOOL as int))
Один из способов
SELECT
sur.*
,MAX(convert(tinyint,bo.BOOL))
FROM SURNAME sur
INNER JOIN BOOL bo
ON bo.IDPERS = sur.IDPERS
Если вам нужны только те люди, у которых только один бит:
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
Вы можете избежать беспорядочно выглядящего двойного приведения путем принудительного неявного приведения:
SELECT
sur.*
,CAST(MAX(1 * bo.BOOL) AS BIT)
FROM SURNAME sur
INNER JOIN BOOL bo
ON bo.IDPERS = sur.IDPERS