Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 希望在大型select查询中合并具有相同ID的行_Sql_Group By_Sql Server 2014 - Fatal编程技术网

Sql 希望在大型select查询中合并具有相同ID的行

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

我有一个很大的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   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。