我使用的是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
答案 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(…)