如何将不同的标志列组合成一行

时间:2015-11-19 14:26:24

标签: sql-server

我使用的是SQL Server 2012,我有下表:

ID1  Team  HasGender  HasAge  HasHeight

 1    Blue   1         (NULL)    1
 2    Blue   1            1    (NULL)

...我想从中显示一行:

 ID1  Team  HasGender  HasAge  HasHeight
  1   Blue    1          1        1

我不太关心要带哪一行,我只需要将所有标志放入一行。

我尝试了IsNULL,使用Group by和Max(没有工作,因为标志字段是比特类型),然后我尝试使用COALESCE和自我加入以下但仍然没有工作;它带回了行的倍数,并且标志仍然没有按照我的要求填写:

  SELECT t1.ID, t1.Team,
          Gender=COALESCE(t1.HasGender, t2.HasGender),
          Age=COALESCE(t1.HasAge, t2.HasAge),
          Height=COALESCE(t1.HasHeight, t2.HasHeight)
  FROM Table t1 INNER JOIN Table t2
  ON t1.Team = t2.Team

我应该注意到这个表有3行或4行这样的标志,所以当我加入时,我似乎得到了倍数。

提前致谢,

Veronica

4 个答案:

答案 0 :(得分:2)

不幸的是,没有办法做MAX(位)。这意味着您可以将其转换为另一种数据类型(smallint因为它很小而受到青睐),或者您可以使用计数:

SELECT
    Team, 
    CASE WHEN COUNT(HasGender)>0 THEN 1 ELSE 0 END AS HasGender
    CASE WHEN COUNT(HasAge)>0 THEN 1 ELSE 0 END AS HasAge
    CASE WHEN COUNT(HasHeight)>0 THEN 1 ELSE 0 END AS HasHeight
FROM Table
GROUP BY Team

这只适用于没有0的情况。如果你有0,你将不得不进行条件计数(但那时我会选择铸造选项)。

要考虑0,每行需要看起来像

CASE WHEN COUNT(CASE HasGender WHEN 1 THEN 1)>0 THEN 1 ELSE 0 END AS HasGender

答案 1 :(得分:0)

您可以尝试这样的事情:

SELECT MIN(ID1), Team, MAX(CONVERT(tinyint, HasGender)), MAX(CONVERT(tinyint, HasAge)), MAX(CONVERT(tinyint, HasHeight))
FROM Table
GROUP BY Team

编辑: 将数据转换为tinyint类型

答案 2 :(得分:0)

您可以将位列转换为tinyint,以便在聚合中使用它们。这样的事情。

SELECT t1.ID
    , t1.Team
    , Gender = MAX(CAST(COALESCE(t1.HasGender, t2.HasGender) as tinyint))
    , Age = MAX(CAST(COALESCE(t1.HasAge, t2.HasAge) as tinyint))
    , Height = MAX(CAST(COALESCE(t1.HasHeight, t2.HasHeight) as tinyint))
  FROM Table t1 INNER JOIN Table t2
  ON t1.Team = t2.Team

答案 3 :(得分:-1)

.send(…)