尝试使用 CASE WHEN THEN 进行 GROUP BY - postgresql

Trying to GROUP BY with CASE WHEN THEN - postgresql

我有三个表 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

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

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