Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试使用CASE-WHEN-postgresql进行分组_Sql_Postgresql_Group By_Case When - Fatal编程技术网

尝试使用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