Sql 希望在大型select查询中合并具有相同ID的行
我有一个很大的select查询,将近50个字段,跨越几个表。它的一部分是检查用户是否是学习者、管理员等。正如您在下面看到的,它返回多行。现在我想把它们聚合成一行,基本上是一个or操作 编辑1:每个bool值都是使用单个字段中的case语句派生的Sql 希望在大型select查询中合并具有相同ID的行,sql,group-by,sql-server-2014,Sql,Group By,Sql Server 2014,我有一个很大的select查询,将近50个字段,跨越几个表。它的一部分是检查用户是否是学习者、管理员等。正如您在下面看到的,它返回多行。现在我想把它们聚合成一行,基本上是一个or操作 编辑1:每个bool值都是使用单个字段中的case语句派生的 User ID | Learner | Admin | Facilitator | Advisor 1 0 0 0 1 1 0 1 0 0 2 0 0 1 0 3 0 0 1 0 3 0
User ID | Learner | Admin | Facilitator | Advisor
1 0 0 0 1
1 0 1 0 0
2 0 0 1 0
3 0 0 1 0
3 0 1 0 0
对此
User ID | Learner | Admin | Facilitator | Advisor
1 0 1 0 1
2 0 0 1 0
3 0 1 1 0
按用户ID添加组时出错
列“Users.FirstName”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
我可能可以在每个字段周围加上MAX,但这不是一个很好的查询,我想一定有更好的方法来实现这一点
这是在MS SQL 2014中
谢谢您可以使用聚合:
select userid,
max(learner) as learner, max(admin) as admin,
max(facilitator) as facilitator, max(advisor) as advisor
from t
group by userid;
编辑:
SQL Server没有将bool作为数据类型。如果您的意思是位
,则可以使用条件逻辑:
select userid,
max(cast(learner as int)) as learner, max(cast(admin as int)) as admin,
max(cast(facilitator as int)) as facilitator, max(cast(advisor as int)) as advisor
from t
group by userid;
您可以在聚合查询和表“Users”之间进行连接,如下所示:
SELECT users.userid
,users.firstName
,tMax.learner
,tMax.admin
,tMax.facilitator
,tMax.advisor
FROM users
inner JOIN (select userid,
max(learner) as learner, max(admin) as admin,
max(facilitator) as facilitator, max(advisor) as advisor
from t
group by userid) AS tMax ON tmax.userId = users.userId
我不确定你会找到比使用MAX()和GROUP BY更干净的查询。为什么不显示你的原始表(使用CASE的单个字段)?如果你需要SQL语句的帮助,发布实际的SQL语句会有所帮助。这对我不起作用,与上面提到的错误相同,FWIW使用单个字段的case语句计算每个bool值,这是一个不必要的复杂性。可能在本例中,但如果select包含许多字段,隔离聚合可以避免在group by中重复所有操作。如果子查询移动到CTE,这可能会减少复杂性。OP的问题是,他试图在不使用聚合函数的情况下对记录进行分组。他说他不想用MAX。