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
答案 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