2014-10-10 87 views
0

我需要動態更改用於分組的GROUP BY子句規則。 始終返回相同的列號和名稱。SQL動態組按不同列數

例如表:

CREATE TABLE employees 
(
    employee_id NOT NULL, 
    department_id integer, 
    status character varying(50), /*active/inactive*/ 
    cost numeric, 
    income (numeric), 
    first_name character varying(50), 
    last_name character varying(50) 
) 

我需要查詢是這樣的:

select 
    count(employee_id) as contacts, 
    sum(cost) as cost, 
    sum(income)/count(employee_id) as average_salary 
from 
    employees 
group by 
    case 
     when status = 'active' then /*group by*/ department_id, employee_id 
     when status = 'inactive' then /*group by*/ employee_id 
    end; 

我如何運行此查詢?

回答

0

這取決於你想達到什麼目的:你可以在任何表達式上使用GROUP BY,而不僅僅是在列上。

您可以使用下面的變型,如果你想不活動的員工和所有部門的員工彼此分開:

-- ... 
GROUP BY CASE 
      WHEN status = 'active' THEN department_id 
      WHEN status = 'inactive' THEN NULL 
     END, 
     employee_id 

但上述解決方案將積累與所有其他誰沒有分配所有非活動的員工到部門(department_id IS NULL)。如果這不涉及你,這是最簡單的解決方案。

您可以使用row constructors太:

-- ... 
GROUP BY CASE 
      WHEN status = 'active' THEN ROW(department_id, employee_id) 
      WHEN status = 'inactive' THEN ROW(employee_id) 
     END 

但要知道如何their comparison作品。

注意:當您在使用GROUP BYemployee_id,然後COUNT(employee_id)永遠是1

+0

非常感謝,它幫了我很多 – peterko 2014-10-13 11:04:56