如何使用4tables中的case语句在postgres sql中连接行

时间:2018-09-11 10:36:19

标签: sql postgresql greatest-n-per-group

emp_id   project_id  TASK_11     TASK_12     TASK_13    TASK_14
42527     4           no         no          no         yes
42527     4           no         yes         no         no
42527     4           yes        no          no         no
42527     4            no        no         yes         no

在上表中,我想显示所有emp_id都需要一次。手段

emp_id   project_id  TASK_11     TASK_12     TASK_13    TASK_14
42527     4           yes        yes         yes            yes

我想像这样显示 下面的命令请让我知道需要修改的地方

select distinct(b.emp_id),c.project_id,
(CASE when task_id='11' then 'yes'
    else 'no'
END) as "TASK_11",
(CASE 
    when task_id='12' then 'yes'
else 'no'
END) as "TASK_12",
(CASE 
    when task_id='13' then 'yes'
    else 'no'
END) as "TASK_13",
(CASE 
    when task_id='14' then 'yes'
    else 'no'
end) as "TASK_14"
FROM "Projects".user_projects a,
    "Projects".user_clients b,
    "Projects".project_tasks c,
    "Projects".user_tasks d,
    "Projects".projects e
WHERE  c.id = d.id AND a.id = b.id AND e.client_id=b.client_id 
    AND a.project_id=c.project_id and b.client_id=e.client_id
    and(b.emp_id = ANY (ARRAY[45262, 42572, 42527, 40904, 808, 909, 109, 
        147, 70707, 41111, 41041, 80808, 4235, 22, 428882, 4001100,
        40904, 42527, 42581, 42581, 12, 12, 42501, 42501, 202, 47100,
        42501, 4001100, 6389, 20240, 11662, 23556, 30480])) 
    AND e.project_name = 'wms' and c.project_id=4

2 个答案:

答案 0 :(得分:0)

您可以使用bool_or()和bool_and()聚合布尔值

您应使用bool_or()

select emp_id, project_id, 
       bool_or(TASK_11) task_11,
       bool_or(TASK_11) task_12,
       bool_or(TASK_11) task_13,
       bool_or(TASK_11) task_14
  from "your_query"
 group by emp_id, project_id

顺便说一句。您的查询在某些地方似乎不正确。首先是不同的(因为Raymond Nijland和a_horse_with_no_name),这部分看起来很奇怪,“ c.id = d.id AND a.id = b.id”,直到id实际上是user_id。

答案 1 :(得分:0)

考虑直接在逻辑MAX语句上运行CASE的简单条件聚集查询。

此外,考虑将SQL重构为使用显式联接(ANSI-92中引入了25年以上的标准),而不是使用较旧的,难以阅读和维护的隐式联接。性能没有任何变化,但可以通过显式JOIN进行阅读和维护。

SELECT b.emp_id, c.project_id,
       MAX(CASE WHEN task_id='11' THEN 'yes' ELSE 'no' END) AS "TASK_11",
       MAX(CASE WHEN task_id='12' THEN 'yes' ELSE 'no' END) AS "TASK_12",
       MAX(CASE WHEN task_id='13' THEN 'yes' ELSE 'no' END) AS "TASK_13",
       MAX(CASE WHEN task_id='14' THEN 'yes' ELSE 'no' END) AS "TASK_14"
FROM "Projects".user_projects a
INNER JOIN "Projects".user_clients b ON b.id = a.id = b.id
INNER JOIN "Projects".project_tasks c ON c.project_id = a.project_id
INNER JOIN "Projects".user_tasks d ON c.id = d.id
INNER JOIN "Projects".projects e ON e.client_id = b.client_id 
WHERE b.emp_id = ANY (ARRAY[45262, 42572, 42527, 40904, 808, 909, 109, 
                            147, 70707, 41111, 41041, 80808, 4235, 22, 428882, 4001100,
                            40904, 42527, 42581, 42581, 12, 12, 42501, 42501, 202, 47100,
                            42501, 4001100, 6389, 20240, 11662, 23556, 30480])
  AND e.project_name = 'wms' and c.project_id = 4
GROUP BY b.emp_id, c.project_id