尝试使用 CASE WHEN THEN 进行 GROUP BY - postgresql
Trying to GROUP BY with CASE WHEN THEN - postgresql
我有三个表 PATH
、ELEMENTS
和 ELEMENT_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
我有三个表 PATH
、ELEMENTS
和 ELEMENT_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