2015-04-14 3 views
0

У меня есть следующий запрос, который отображает сумму сотрудников в определенной группе (A1, B1..etc) и в отделе specialc.Oracle Sql Query для возврата строки, когда нет данных

Проблема заключается в отсутствии данных для определенного отдела в определенную дату, тогда эта строка с именем отдела вообще не отображается, и я хочу, чтобы запрос отображал все имена строк/отделов, даже если они имеют данные в нем или нет. Он должен отображать «0» в таком случае.

SELECT NVL(TO_CHAR(COALESCE(dept_name,'NA')),'TOTAL') AS Department, 
    SUM (
    CASE 
    WHEN (emp_group IN('ABC','CDE','EFG','GHI')) 
    THEN 1 
    ELSE 0 
    END) AS A1, 
    SUM(
    CASE 
    WHEN (emp_group IN ('XYZ')) 
    THEN 1 
    ELSE 0 
    END) AS B1, 
    SUM (
    CASE 
    WHEN (emp_group IN ('ABC','CDE','EFG','GHI','XYZ')) 
    THEN 1 
    ELSE 0 
    END) AS TOTAL 
FROM emp e 
WHERE 
dept_name IN('IT','FI','ACC') 
AND e.transaction_date   = trunc(sysdate) 
GROUP BY rollup(COALESCE(dept_name,'NA')) 

Заранее спасибо

+0

Возможно, вам следует прочитать о внешних соединениях. – beerbajay

+0

Левые соединения работают только при наличии доступной таблицы. Есть ли таблица отделов? Есть ли внешний ключ от emp до отдела? –

+0

Нет, есть только 1 таблица, и это «emp». – Akshay

ответ

1

departments Начать с (вы должны иметь что-то подобное ...) и сделать левое соединение:

SELECT NVL(TO_CHAR(COALESCE(d.dept_name,'NA')),'TOTAL') AS Department, 
    SUM (
    CASE 
    WHEN (emp_group IN('ABC','CDE','EFG','GHI')) 
    THEN 1 
    ELSE 0 
    END) AS A1, 
    SUM(
    CASE 
    WHEN (emp_group IN ('XYZ')) 
    THEN 1 
    ELSE 0 
    END) AS B1, 
    SUM (
    CASE 
    WHEN (emp_group IN ('ABC','CDE','EFG','GHI','XYZ')) 
    THEN 1 
    ELSE 0 
    END) AS TOTAL 
FROM departments d 
left join emp e on d.dept_id = e.dept_id 
WHERE 
d.dept_name IN('IT','FI','ACC') 
AND e.transaction_date   = trunc(sysdate) 
GROUP BY rollup(COALESCE(d.dept_name,'NA')); 

Если у вас нет отделов вы можете левое соединение с двойным таким образом:

SELECT NVL(TO_CHAR(COALESCE(e.dept_name,'NA')),'TOTAL') AS Department, 
    SUM (
    CASE 
    WHEN (emp_group IN('ABC','CDE','EFG','GHI')) 
    THEN 1 
    ELSE 0 
    END) AS A1, 
    SUM(
    CASE 
    WHEN (emp_group IN ('XYZ')) 
    THEN 1 
    ELSE 0 
    END) AS B1, 
    SUM (
    CASE 
    WHEN (emp_group IN ('ABC','CDE','EFG','GHI','XYZ')) 
    THEN 1 
    ELSE 0 
    END) AS TOTAL 
FROM (select 'IT' as dept_name from dual union all 
     select 'FI' from dual union all 
     select 'ACC' from dual) d 
left join emp e on d.dept_name = e.dept_name 
WHERE 
    e.transaction_date   = trunc(sysdate) 
GROUP BY rollup(COALESCE(e.dept_name,'NA')); 
+0

Нет, есть только 1 стол, и это «emp». Как я могу добиться этого с помощью 1 таблицы сейчас? Благодарю. – Akshay

+0

Я пробовал вышеуказанный запрос с левым соединением в той же таблице и на двойной таблице, но он отображает тот же результат, что и раньше. – Akshay