Sql Postgres:如何连接多个表?
我在postgres10、T1和T2中有2个表,如下所示,我想有3个不同的查询:Sql Postgres:如何连接多个表?,sql,postgresql,join,Sql,Postgresql,Join,我在postgres10、T1和T2中有2个表,如下所示,我想有3个不同的查询: 一次查询中每个用户的nb_hour_doc+nb_hour_interv的总数 一次查询中每个用户的nb_doc+nb_interv总数 每个项目的nb_小时文档+nb_小时interv的总数 表T1 | user_id | user_name | project | nb_hour_doc | nb_doc | doc_start | doc_end
我想这应该是你想要的。我只做了第一个,使用最少的必需信息创建了表。它根据用户id和用户名进行分组,并对每个用户的两个字段中的值求和
SELECT u.user_id, u.user_name, COALESCE(SUM(t1.nb_hour_doc), 0) + COALESCE(SUM(t2.nb_hour_interv), 0) AS result
FROM users u
LEFT JOIN t1 USING (user_id)
LEFT JOIN t2 USING (user_id)
GROUP BY u.user_id, u.user_name
您可以在这里进行测试:我认为这应该能满足您的需求。我只做了第一个,使用最少的必需信息创建了表。它根据用户id和用户名进行分组,并对每个用户的两个字段中的值求和
SELECT u.user_id, u.user_name, COALESCE(SUM(t1.nb_hour_doc), 0) + COALESCE(SUM(t2.nb_hour_interv), 0) AS result
FROM users u
LEFT JOIN t1 USING (user_id)
LEFT JOIN t2 USING (user_id)
GROUP BY u.user_id, u.user_name
您可以在这里测试它:我认为这应该可以工作,尽管我只在MariaDb(MySQL)中测试过它 编辑:修复了上一个项目查询
虽然我只在MariaDb(MySQL)中测试了它,但我认为它应该可以工作 编辑:修复了上一个项目查询
我添加了预期的输出。当您使用
vi.nb\u hour\u interv
并且vi是T2别名,但T2没有名为nb\u hour\u interv的字段时,查询是如何工作的?抱歉,编辑时我忘了更改名称。请不要在一个问题中问多个问题。我添加了预期的输出。当您使用vi.nb\u hour\u interv
,并且vi是T2别名,但T2没有名为nb\u hour\u interv的字段时,查询如何工作?抱歉,编辑时我忘了更改名称。请不要在一个问题中问多个问题。很好,它适用于查询1,但如果一个用户在T2和T1中没有记录,如何获得信息?例如:在T1和T2上Boto为0。@VASHIA我已更新查询,添加了左连接和合并,以包括其他表中没有记录的用户。查看更新的链接。很好,它适用于查询1,但是如果一个用户在T2和T1中没有记录,如何获取信息?例如:在T1和T2中Boto是0。@VASHIA我已经更新了查询,添加了左连接和合并,以包括其他表中没有记录的用户。查看更新的链接。很好,它可以工作!我只是将第二个查询更改为获取nb_doc和nb_interv的sum
,我将查询放在这个链接中。谢谢是的,很抱歉,复制/粘贴错误;)我会更新我的答案的。好吧,它能用!我只是将第二个查询更改为获取nb_doc和nb_interv的sum
,我将查询放在这个链接中。谢谢是的,很抱歉,复制/粘贴错误;)我会更新我的答案。
select u.user_id, u.user_name, COALESCE(sum(vd.nb_hour_doc),0) as nb_hour_doc, COALESCE(sum(vd.nb_doc),0) as nb_doc, COALESCE(vi.project,'none') as projet_nom_doc, COALESCE(vd.project,'none') as projet_nom_int,
COALESCE(sum(vi.nb_hour_interv),0) as nb_hour_interv, COALESCE(sum(vi.nb_interv),0) as nb_interv from users u
LEFT JOIN T1 vd ON vd.user_id = u.user_id
LEFT JOIN T2 vi ON vi.user_id = u.user_id
GROUP BY vi.project, u.user_id, u.user_name, vd.project
| user_id | user_name | nb_hour_doc+ nb_hour_interv |
|--------- |:---------: |----------------------------- |
| 1002 | Diana | 7070 |
| 1003 | Alex | 17324 |
| 1004 | Boto | 0 |
| 1001 | Toto | 11031 |
| user_id | user_name | (nb_doc + nb_interv) |
|--------- |:---------: |------------- |
| 1001 | Toto | 6 |
| 1002 | Diana | 3 |
| 1003 | Alex | 13 |
| 1004 | Boto | 0 |
| project | (nb_hour_doc+ nb_hour_interv) |
|--------- |------------- |
| OTHERS | 11242 |
| DEV | 7072 |
| NEXT | 31 |
| PLUG | 10010 |
| FIRST | 70 |
| GIT | 7000 |
SELECT u.user_id, u.user_name, COALESCE(SUM(t1.nb_hour_doc), 0) + COALESCE(SUM(t2.nb_hour_interv), 0) AS result
FROM users u
LEFT JOIN t1 USING (user_id)
LEFT JOIN t2 USING (user_id)
GROUP BY u.user_id, u.user_name
SELECT u.user_id, u.user_name,
COALESCE((SELECT SUM(nb_hour_doc) FROM T1 WHERE user_id = u.user_id GROUP BY user_id) +
(SELECT SUM(nb_hour_interv) FROM T2 WHERE user_id = u.user_id GROUP BY user_id), 0) AS hours
FROM users u
SELECT u.user_id, u.user_name,
COALESCE((SELECT SUM(nb_doc) FROM T1 WHERE user_id = u.user_id GROUP BY user_id) +
(SELECT SUM(nb_interv) FROM T2 WHERE user_id = u.user_id GROUP BY user_id), 0) AS hours
FROM users u
SELECT z.project, SUM(z.hour)
FROM (SELECT project, nb_hour_doc as hour
FROM T1
UNION ALL
SELECT project, nb_hour_interv AS hour
FROM T2
) as z
GROUP BY z.project