【问题标题】:Postgres: How to join multiple tables?Postgres:如何加入多个表?
【发布时间】:2018-03-26 12:12:55
【问题描述】:

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

  1. 一个查询中每个用户的 nb_hour_doc + nb_hour_interv 总数;
  2. 一个查询中每个用户的 nb_doc + nb_interv 总数;
  3. 每个项目的 nb_hour_doc + nb_hour_interv 总数;

表 T1

|用户 ID |用户名 |项目 | nb_hour_doc | nb_doc |文档开始 |文档结束 | |-----------|:-------:|----------:|---- ----------|:-------:|------------------:|--------- ----------| |1001 |多多 |其他 |11000 |2 |2018-03-25 12:13:00|2018-03-25 12:15:00| |1002 |戴安娜 |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 |插头 |10000 |1 |2018-03-25 12:23:00|2018-03-25 12:25:00| |1002 |戴安娜 |插头 |7100 |1 |2018-03-25 12:16:00|2018-03-25 12:51:00|

表 T2:

|用户 ID |用户名 |项目 | nb_hour_interv | nb_interv | int_start | int_end | |---------|:---------:|--------:|-------------|--- --|------------------------|----------| | 1003 |亚历克斯 |其他 | 71 | 2 | 2018-03-25 12:13:00 | 2018-03-25 12:15:00 | | 1003 |亚历克斯 |开发 | 71 | 1 | 2018-03-25 08:11:00 | 2018-03-25 08:30:00 | | 1003 |亚历克斯 |其他 | 171 | 5 | 2018-03-25 02:08:00 | 2018-03-25 02:45:00 | | 1001 |托托 |下一个 | 31 | 4 | 2018-03-25 13:13:00 | 2018-03-25 13:15:00 | | 1003 |亚历克斯 |插头 | 10 | 1 | 2018-03-25 14:19:00 | 2018-03-25 14:55:00 | | 1002 |戴安娜 |第一 | 70 | 1 | 2018-03-25 17:43:00 | 2018-03-25 17:55:00 |

还有一个包含用户信息的表格:

用户:

|用户 ID |用户名 | |---------|:---------:| | 1002 |戴安娜 | | 1003 |亚历克斯 | | 1004 |博托 | | 1001 |托托 |

我使用了这个查询,但它没有给出预期的结果:

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 的总和
|用户 ID |用户名 | nb_hour_doc+ nb_hour_interv | |--------- |:---------: |---------------------------- -- | | 1002 |戴安娜 | 7070 | | 1003 |亚历克斯 | 17324 | | 1004 |博托 | 0 | | 1001 |托托 | 11031 |
  1. 每个用户的 nb_doc + nb_interv 总数:
|用户 ID |用户名 | (nb_doc + nb_interv) | |--------- |:---------: |------------- | | 1001 |托托 | 6 | | 1002 |戴安娜 | 3 | | 1003 |亚历克斯 | 13 | | 1004 |博托 | 0 |
  1. 每个项目的 nb_hour_doc + nb_hour_interv 总数
|项目 | (nb_hour_doc+ nb_hour_interv) | |--------- |------------- | |其他 | 11242 | |开发 | 7072 | |下一个 | 31 | |插头 | 10010 | |第一 | 70 | |吉特 | 7000 |

【问题讨论】:

  • 我添加了预期的输出。
  • 当您使用vi.nb_hour_interv,并且vi 是T2 别名,但T2 没有名为nb_hour_interv 的字段时,查询是如何工作的?
  • 抱歉,编辑的时候忘记改名字了。
  • 请不要在一个问题中问多个问题。

标签: sql postgresql join


【解决方案1】:

我认为这应该可以工作,虽然我只在 MariaDb (MySQL) 中测试过

编辑:修复了最后一个项目查询

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

【讨论】:

  • 很好,可以!我只是更改第二个查询以获取 nb_docnb_intervsum 我将查询放在此链接中。 sqlfiddle.com/#!15/483d1/3。谢谢
  • 是的,很抱歉,复制/粘贴错误;)我会更新我的答案。
【解决方案2】:

我认为这应该可以满足您的需求。我只完成了第一个,使用最少的所需信息创建表。它按 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可以,但是如果一个用户在T2和T1都没有记录,如何获取信息呢?例如:Boto0 在 T1 和 T2 上。
  • @VASHIA 我更新了查询,添加了 LEFT JOIN 和 COALESCE 以包含其他表中没有记录的用户。查看更新的链接。
猜你喜欢
  • 2011-07-12
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 2015-08-13
  • 2017-05-11
  • 1970-01-01
相关资源
最近更新 更多