2015-04-14 37 views
0

我有以下查詢,它顯示特定組(A1,B1..etc)和特定部門中的員工總數。Oracle Sql查詢在沒有數據時返回行

問題是當特定日期沒有特定部門的數據時,那麼該部門名稱的行根本沒有顯示,我希望查詢顯示所有行/部門名稱,即使他們有數據在它或不。在這種情況下它應該顯示'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

只有存在可用的表格時,左連接才能工作。有部門表嗎?是否有從外部到外部的外鍵? –

+0

不,只有一張桌子,那是'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

不,只有一個表,那就是'emp'。我現在如何用1張桌子實現它?謝謝。 – Akshay

+0

我嘗試了上面的查詢,並在同一張桌子和雙重桌子上進行了左連接,但它顯示的結果與以前相同。 – Akshay