如何使用sql查询2个表和分组依据?
我有两个表:活动和用户。 用户有列:名称、活动 活动:名称、类型、时间、用户id 例如,我有以下表格:如何使用sql查询2个表和分组依据?,sql,postgresql,sum,Sql,Postgresql,Sum,我有两个表:活动和用户。 用户有列:名称、活动 活动:名称、类型、时间、用户id 例如,我有以下表格: users ----- id | name | active 1 | marc | true 2 | john | true 3 | mary | true 4 | nico | true activities ----- id | name | type | time | user_id 1 | morn | walk | 90 | 2 2 | morn | walk |
users
-----
id | name | active
1 | marc | true
2 | john | true
3 | mary | true
4 | nico | true
activities
-----
id | name | type | time | user_id
1 | morn | walk | 90 | 2
2 | morn | walk | 22 | 2
3 | morn | run | 12 | 2
4 | sat | walk | 22 | 1
5 | morn | run | 13 | 1
6 | mond | walk | 22 | 3
7 | morn | walk | 22 | 2
8 | even | run | 42 | 1
9 | morn | walk | 22 | 3
10 | morn | walk | 62 | 1
11 | morn | run | 22 | 3
现在我想得到一个表,该表将汇总每种类型的活动所花费的时间,并按用户名对其进行分组。因此:
result
------
user name | type | time
marc | walk | 84
marc | run | 55
john | walk | 134
john | run | 12
mary | walk | 44
mary | run | 2
nico | walk | 0
nico | run | 0
我应该如何编写此查询以获得此结果
提前谢谢
杰拉德
使用此选项也可以获得零计数
SELECT c.name,c.type,aa.time FROM
(Select u.id,u.name, b.type FROM
users u
CROSS JOIN (SELECT DISTINCT type FROM activities) b) c
LEFT JOIN (SELECT a.user_id, a.type, SUM(a.time) as time FROM
activities a
GROUP BY a.user_id, a.type) aa ON
aa.user_id = c.id and c.type = aa.type
这可能有效:
select users.name,activities.type,sum(activities.time)
from users left join activities on users.id = activities.user_id
where users.active group by users.name,activities.type
您可以使用
coalesce
获取空活动的0,并使用distinct
获取所有类型的可能活动
select
u.name, c.type,
coalesce(sum(a.time), 0) as time
from (select distinct type from activities) as c
cross join users as u
left outer join activities as a on a.user_id = u.id and a.type = c.type
group by u.name, c.type
order by u.name, c.type
看起来是一个很好的家庭作业,你为什么不试着发布你解决这个问题的尝试呢?我们在这里是为了帮助您,而不是为了工作。实际上,您希望按用户名和活动对其进行分组。这是基本的sql。既然你不知道怎么做,你可以考虑在做事情之前先学习基础知识。为此,我听到了这本书的好消息,在10分钟内自学SQL。你是对的,我已经尝试编写正确的SQL查询,但我感到困惑,所以我决定在这里问一个问题。寻找答案,我发现有一个简单的解决方案。下次我会更加努力。谢谢你的意见。谢谢,它很有效。我只是想知道如何用0分钟播放用户activity@gerpaick它可以变得更干净。我认为这个问题应该尽可能可读,看看我的答案
select
u.name, c.type,
coalesce(sum(a.time), 0) as time
from (select distinct type from activities) as c
cross join users as u
left outer join activities as a on a.user_id = u.id and a.type = c.type
group by u.name, c.type
order by u.name, c.type