尝试使用CASE THEHEN时进行GROUP BY-postgresql

时间:2018-07-02 10:54:22

标签: sql postgresql group-by case-when

我有三个具有以下结构的表PATHELEMENTSELEMENT_DETAILS

路径:

ID
1
2
3

元素:

ID | PATH_ID | DIRECTION | ELEMENT_DETAILS_ID
1    1         'left'      1
2    1         'right'     2
3    2         'left'      3
4    2         'right'     2

ELEMENT_DETAILS:

ID | NAME
1    'Henry'
2    'Mark'
3    'John'

我希望结果像这样:

ID  | left    |   right
1    'Henry'      'Mark'
2    'John'       'Mark'

这是我到目前为止提出的SQL:

      SELECT path.id, 
             CASE WHEN elements.direction='left' THEN element_details.name
             ELSE NULL END
            as left,
             CASE WHEN elements.direction='right' THEN element_details.name
             ELSE NULL END
            as right,
      FROM elements
      INNER JOIN path on elements.path_id = path.id
      LEFT JOIN element_details on elements.element_details_id = element_details.id
      GROUP BY path.id
      ORDER BY path.id

但是,这不起作用,因为postgres给我一个错误,提示elements.direction should be in group by。而且在group_by中包含elements.direction并不能使我在path.id级别进行聚合。

坚持下去。有人可以帮忙吗? 我正在使用Postgres 9.5版

1 个答案:

答案 0 :(得分:2)

您需要聚合。这是一种方法:

SELECT p.id, 
       MAX(CASE WHEN e.direction = 'left' THEN ed.name
           END) as left,
       MAX(CASE WHEN e.direction = 'right' THEN ed.name
           END) as right
FROM elements e INNER JOIN
     path p
     ON e.path_id = p.id LEFT JOIN
     element_details ed
     ON e.element_details_id = ed.id
GROUP BY p.id
ORDER BY p.id