如何将SQL查询与2个子查询分开

时间:2017-10-10 09:38:12

标签: sql postgresql postgresql-9.4

我有一个包含这些表的数据库:

  1. 用户(身份证,电子邮件)
  2. 旅行(id,driver_id)
  3. MatchedTrips(id,trip_id)
  4. 我需要为每个用户 他创建的旅行总数除以找到的总匹配数。

    我坚持为此构建原始SQL查询。这是我尝试过的,并且确定它远非正确。

    SELECT
      users.email,
      total_trips.count1 / total_matches.count2
    FROM users CROSS JOIN (SELECT
            users.email,
            count(trips.driver_id) AS count1
          FROM trips
            INNER JOIN users ON trips.driver_id = users.id
          GROUP BY users.email) total_trips
          CROSS JOIN (SELECT users.email, count(matches.trip_id) AS count2
                       FROM matches
                       LEFT JOIN trips ON matches.trip_id = trips.id
                       LEFT JOIN users ON trips.driver_id = users.id
                       GROUP BY users.email) total_matches;
    

2 个答案:

答案 0 :(得分:2)

您可以通过以下方式计算每位车手的总行程和总比赛:

select driver_id, count(t.id) as total_trips, count(m.id) as total_matches
from trips t
left join matches m on (t.id = trip_id)
group by 1

将此查询用作与users联接的派生表:

select email, total_trips, total_matches, total_trips::dec/ nullif(total_matches, 0) result
from users u
left join (
    select driver_id, count(t.id) as total_trips, count(m.id) as total_matches
    from trips t
    left join matches m on (t.id = trip_id)
    group by 1
    ) s on u.id = driver_id
order by 1;

SQLFiddle.

答案 1 :(得分:1)

最简单的方法可能是使用count(distinct)

select u.email,
       count(distinct t.id) as num_trips,
       count(distinct m.id) as num_matches,
       (count(distinct t.id) / count(distinct m.id)) as ratio
from users u left join
     trips t
     on t.driver_id = u.id left join
     matches m
     on m.trip_id = t.trip_id
group by u.email;

注意:如果电子邮件是唯一的,则可以简化查询。 count(distinct)在某些情况下可能会很昂贵。