尝试使用CASE-WHEN-postgresql进行分组
我有三个表尝试使用CASE-WHEN-postgresql进行分组,sql,postgresql,group-by,case-when,Sql,Postgresql,Group By,Case When,我有三个表PATH,ELEMENTS和ELEMENT\u DETAILS,结构如下: 路径: 要素: ID | PATH_ID | DIRECTION | ELEMENT_DETAILS_ID 1 1 'left' 1 2 1 'right' 2 3 2 'left' 3 4 2 'right' 2 元素_详细信息: ID | NAME 1 'Henry' 2
PATH
,ELEMENTS
和ELEMENT\u DETAILS
,结构如下:
路径:
要素:
ID | PATH_ID | DIRECTION | ELEMENT_DETAILS_ID
1 1 'left' 1
2 1 'right' 2
3 2 'left' 3
4 2 'right' 2
元素_详细信息:
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给我一个错误,说元素。方向应该在group by
中。并且在group_by中包含元素.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
你需要聚合。这里有一种方法:
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