【问题标题】:Get MAX value of a BIT column获取 BIT 列的 MAX 值
【发布时间】:2012-06-03 23:04:05
【问题描述】:

我有一个 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

但是 BIT 列上没有 MAX。那我该怎么做呢?

谢谢,

【问题讨论】:

  • 如果您想确保恰好一个值为1,您似乎需要使用SUMGROUP BY

标签: sql sql-server tsql sql-server-2008 stored-procedures


【解决方案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

【讨论】:

    【解决方案2】:

    试试:

    max(cast(bo.BOOL as int))
    

    【讨论】:

    • 他只是将其转换为整数,因此他可以使用最大聚合函数。
    • 这个好多了。它也适用于 OVER 子句。
    【解决方案3】:

    一种方式

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

    【讨论】:

    • 不,它们是一样的,我只是更喜欢转换
    【解决方案4】:

    你可以通过强制隐式转换来避免看起来凌乱的双重转换:

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

    【讨论】:

    • 对我来说,这更麻烦,但是 +1 展示了一种我以前从未见过的新方法
    【解决方案5】:

    如果你只想要那些正好一组的人:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-06
      • 2012-01-27
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      • 2019-07-20
      • 1970-01-01
      相关资源
      最近更新 更多