Как объединить строки в Postgres SQL с помощью оператора case из 4tables - PullRequest
0 голосов
/ 11 сентября 2018
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 голосов
/ 11 сентября 2018

Рассмотрим простой условный агрегатный запрос, непосредственно выполняющий MAX для ваших логических CASE операторов.

Кроме того, рассмотрите возможность перефакторинга SQL для использования явных объединений (стандарт 25+ лет, введенный в ANSI-92), а не более старых, трудных для чтения и поддержки неявных объединений, как в настоящее время. Нет никаких изменений в производительности, но, возможно, легче читать и поддерживать с явным 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
0 голосов
/ 11 сентября 2018

Вы можете агрегировать логические значения с помощью 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

Btw.Ваш запрос кажется неправильным в нескольких местах.Первый отличен (как Раймонд Нейланд и a_horse_with_no_name), и эта часть выглядит странно "c.id = d.id AND a.id = b.id", пока id на самом деле не является user_id.

...