Postgres:如何加入多个表?

时间:2018-03-26 12:12:55

标签: sql postgresql join

我在postgres10,T1和T2中有2个表,如下所示,我想要3个不同的查询:

  1. 一个查询中每个用户的总nb_hour_doc + nb_hour_interv;
  2. 一个查询中每个用户的nb_doc + nb_interv总数;
  3. 每个项目的总nb_hour_doc + nb_hour_interv;
  4. 表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|
    

    表T2:

    | user_id | user_name | project | nb_hour_interv | nb_interv | int_start | int_end |
    |---------|:---------:|--------:|-------------|--------|---------------------|---------------------|
    | 1003 | Alex | OTHERS | 71 | 2 | 2018-03-25 12:13:00 | 2018-03-25 12:15:00 |
    | 1003 | Alex | DEV | 71 | 1 | 2018-03-25 08:11:00 | 2018-03-25 08:30:00 |
    | 1003 | Alex | OTHERS | 171 | 5 | 2018-03-25 02:08:00 | 2018-03-25 02:45:00 |
    | 1001 | Toto | NEXT | 31 | 4 | 2018-03-25 13:13:00 | 2018-03-25 13:15:00 |
    | 1003 | Alex | PLUG | 10 | 1 | 2018-03-25 14:19:00 | 2018-03-25 14:55:00 |
    | 1002 | Diana | FIRST | 70 | 1 | 2018-03-25 17:43:00 | 2018-03-25 17:55:00 |
    
    

    以及包含有关用户信息的表:

    用户:

    | user_id | user_name |
    |---------|:---------:|
    | 1002 | Diana |
    | 1003 | Alex |
    | 1004 | Boto |
    | 1001 | Toto |
    

    我使用此查询但未提供预期结果:

    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
    

    任何人都可以帮助我?

    我想要这样的事情:

    1. nb_hour_doc + nb_hour_interv
    2. 的总和
      | user_id   | user_name     | nb_hour_doc+ nb_hour_interv   |
      |---------  |:---------:    |-----------------------------  |
      | 1002  | Diana     | 7070  |
      | 1003  | Alex  | 17324     |
      | 1004  | Boto  | 0     |
      | 1001  | Toto  | 11031     |
      
      
      1. 每个用户的总nb_doc + nb_interv:
      2. | user_id   | user_name     | (nb_doc + nb_interv)  |
        
        |---------  |:---------:    |-------------  |
        
        | 1001      |    Toto       | 6         |
        | 1002      |   Diana       | 3         |
        | 1003      |    Alex       | 13            |
        | 1004      |    Boto       | 0         |
        
        1. 每个项目的总nb_hour_doc + nb_hour_interv
        2. | project   | (nb_hour_doc+ nb_hour_interv) |
          |---------  |-------------  |
          | OTHERS    | 11242         |
          | DEV       | 7072          |
          | NEXT      | 31            |
          | PLUG      | 10010         |
          | FIRST     | 70            |
          | GIT       | 7000          |
          

2 个答案:

答案 0 :(得分:1)

我认为这应该可以满足您的需求。我只完成了第一个,使用最少的必需信息创建表。它按user_id和user_name进行分组,并为每个用户的几个字段中的值求和。

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

您可以在此处进行测试:http://sqlfiddle.com/#!15/483d1/2/0

答案 1 :(得分:1)

我认为这应该有效,尽管我只在MariaDb(MySQL)

中进行了测试

编辑:修复了上次项目查询

async