Sql Postgres:如何连接多个表?

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

我在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 | |-----------|:-------------------:|---------:|--------------|:-------:|------------------:|-------------------| |1001 |Toto |OTHERS |11000 |2 |2018-03-25 12:13:00|2018-03-25 12:15:00| |1002 |Diana |GIT |7000 |1 |2018-03-25 13:00:00|2018-03-25 13:15:00| |1003 |Alex |DEV |7001 |3 |2018-03-25 11:03:05|2018-03-25 11:35:40| |1003 |Alex |PLUG |10000 |1 |2018-03-25 12:23:00|2018-03-25 12:25:00| |1002 |Diana |PLUG |7100 |1 |2018-03-25 12:16:00|2018-03-25 12:51:00| 有人能帮我吗

    我想要这样的东西:

  • nb_小时文档+nb_小时interv的总和
  • |用户id |用户名称| nb |小时|文档+nb |小时| interv| |--------- |:---------: |----------------------------- | |1002 |戴安娜| 7070| |1003 |亚历克斯| 17324| |1004 |博托| 0| |1001 |托托| 11031|
  • 每个用户的nb_文档+nb_interv的总数:
  • |用户id |用户名称|(nb|U文档+nb|U interv)| |--------- |:---------: |------------- | |1001 | Toto | 6| |1002 |戴安娜| 3| |1003 |亚历克斯| 13| |1004 |博托| 0|
  • 每个项目的nb_小时文档+nb_小时interv的总数
  • |项目(nb|小时文档+nb|小时interv)| |--------- |------------- | |其他| 11242| |开发| 7072| |下一个| 31| |插头| 10010| |第一| 70| |7000吉特|
    我想这应该是你想要的。我只做了第一个,使用最少的必需信息创建了表。它根据用户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