Sql 多列上的查询计数()

Sql 多列上的查询计数(),sql,sql-server,join,count,Sql,Sql Server,Join,Count,为了练习,我创建了以下数据库 我希望能够计算()每个用户在表“舞蹈”中的舞蹈数 这就是问题所在 SELECT [user].[id_user], [user].[user_name], COUNT([dance].[dancer_2_id_user]) AS 'number of dances' FROM [user] LEFT JOIN [dance] ON [user].[id_user] = [dance].[dancer_2_id_user] GR

为了练习,我创建了以下数据库

我希望能够计算()每个用户在表“舞蹈”中的舞蹈数

这就是问题所在

SELECT 
    [user].[id_user], [user].[user_name], 
    COUNT([dance].[dancer_2_id_user]) AS 'number of dances'
FROM 
    [user]
LEFT JOIN 
    [dance] ON [user].[id_user] = [dance].[dancer_2_id_user]
GROUP BY 
    [user].[id_user], [user].[user_name]
返回用户在“dancer_2_id_user”列中计数的次数

这个问题呢

SELECT 
    [user].[id_user], [user].[user_name], 
    COUNT([dance].[dancer_1_id_user]) AS 'number of dances'
FROM 
    [user]
LEFT JOIN 
    [dance] ON [user].[id_user] = [dance].[dancer_1_id_user]
GROUP BY 
    [user].[id_user], [user].[user_name]
返回用户在“dancer\u 1\u id\u user”列中计数的次数

我想把这两个查询放在一起,因为用户可以出现在“舞蹈”表的任意一列中,以便能够计算每个用户的舞蹈总数


使用
union all

select
    user_id,
    user_name,
    sum(number_of_dances) as number_of_dances
from
(
    SELECT 
        [user].[id_user] as user_id, 
        [user].[user_name] as user_name, 
        count([dance].[dancer_2_id_user]) as number_of_dances
    FROM [user]
    left JOIN [dance]
    ON [user].[id_user] = [dance].[dancer_2_id_user]
    GROUP BY [user].[id_user], [user].[user_name]

    union all


    SELECT 
        [user].[id_user], 
        [user].[user_name], 
        count([dance].[dancer_1_id_user])
    FROM [user]
    left JOIN [dance]
    ON [user].[id_user] = [dance].[dancer_1_id_user]
    GROUP BY [user].[id_user], [user].[user_name]

)val
group by
    user_id,
    user_name

您可以使用中的运算符
用户
加入到
舞蹈
,同时满足这两种条件:

SELECT u.[id_user], u.[user_name], 
       COUNT(d.id_dance) AS [number of dances]
FROM [user] u LEFT JOIN [dance] d
ON u.[id_user] IN (d.[dancer_1_id_user], d.[dancer_2_id_user])
GROUP BY u.[id_user], u.[user_name]
请参阅。
结果:


非常感谢。我只是在读课程中关于“联合”的章节:)from语句后面的“val”是什么?@Tanuki您必须为子查询提供别名,它可以是任何东西,所以我随机选择了
val
。因此,我首先对两个查询进行了
合并,然后对每个用户的舞蹈计数求和。我不知道我们可以这样做
计数(合并(d.[dancer\u 1\u id\u user],d.[dancer\u 2\u id\u user])
。很好的解决方案,今天我学到了一些新东西。我已经编辑过了。你在dance中有一个主键,你可以用它来代替coalesce(),这会更好。@forpas我在加入后不知道in的用法,我只知道in和WHERE的用法。我正在寻找如何用这种方式使用它的解释,但我找不到其他例子或教程。你能给我指个地方解释一下吗?ON子句中IN的用法没有什么特别之处。中的运算符返回布尔值:TRUE或FALSE,可以在布尔值有效的任何位置使用。就像
a.id=b.id
返回TRUE或FALSE一样。您可以在这里阅读更多内容:谢谢@forpas,实际上,链接中的示例也显示了in与where子句的用法,但我想我已经开始了解如何使用它了。我刚刚用这个魔术重新格式化了我的一个查询。
SELECT u.[id_user], u.[user_name], 
       COUNT(d.id_dance) AS [number of dances]
FROM [user] u LEFT JOIN [dance] d
ON u.[id_user] IN (d.[dancer_1_id_user], d.[dancer_2_id_user])
GROUP BY u.[id_user], u.[user_name]
> id_user | user_name | number of dances
> ------: | :-------- | ---------------:
>       1 | sara      |                3
>       2 | elenor    |                4
>       3 | eva       |                2
>       4 | mike      |                2
>       5 | phil      |                3
>       6 | laurent   |                1
>       7 | nidia     |                1
>       8 | franz     |                1
>       9 | stephan   |                1
>      10 | sandra    |                3
>      11 | virginie  |                1
>      12 | claire    |                3
>      13 | laurence  |                1
>      14 | pierre    |                2
>      15 | thierry   |                0
>      16 | nancy     |                0