2013-10-08 9 views
0

У меня есть данные в таблице EMP_DETAILSFetch нулю, если даже нет подходящих записей

EMPLOYEE_NUMBER  ROLE 
NSA5421    CONTRACTOR 
NSA390    CONTRACTOR 
E8923    EMPLOYEE 
E2390    EMPLOYEE 

Я хотел бы иметь нулевой отображаться даже нет записей, я попытался следующие, но он не получил желаемый результат

SELECT CASE WHEN cnt IS NULL THEN 0 ELSE cnt END cnt, 
     CASE WHEN role IS NULL THEN '0' ELSE role END role 
FROM 
(SELECT COUNT (*) cnt, role 
    FROM emp_details 
    WHERE employee_number = 'E3400' 
GROUP BY role) 
+0

на основе данных ур, с employee_number = 'E3400', никаких записей не возвращается =) –

ответ

1

Пожалуйста, попробуйте:

select 
    NVL(y."ROLE", '0') "ROLE", 
    case when y."ROLE" is null then 0 else COUNT(*) end cnt 
from(
     SELECT 'E3400' employee_number from dual 
)x left join emp_details y on x.employee_number=y.employee_number 
group by "ROLE" 
1

Ваш внутренний запрос не возвращает ничего, а не нулевой значения.

SELECT COUNT (*) cnt, role 
    FROM emp_details 
    WHERE employee_number = 'E3400' 
GROUP BY role 

Использование EXISTS пункт

1
SELECT CASE WHEN cnt IS NULL THEN 0 ELSE cnt END cnt, 
     CASE WHEN role IS NULL THEN '0' ELSE role END role 
FROM 
(SELECT COUNT (*) cnt, role 
    FROM emp_details 
    WHERE employee_number = 'E3400' 
GROUP BY ROLE 
UNION 
SELECT NULL, NULL FROM dual 
WHERE NOT EXISTS 
    (SELECT COUNT (*) cnt, role 
    FROM emp_details 
    WHERE employee_number = 'E3400' 
GROUP BY ROLE 
    ) 
); 
+0

2 записи, отображаемые для employee_number, отличных от 'E3400'. – TechDo

+0

@techdo, UPDATED, просмотрите пожалуйста. – ajmalmhd04

1

Еще один способ.

SELECT a.role, 
     count(b.role) 
    FROM emp_details a left outer join emp_details b 
    on a.employee_number = b.employee_number 
    and a.employee_number = 'E3400' 
group by a.role; 

Выход:

|  ROLE | COUNT(B.ROLE) | 
-------------|---------- -----| 
| CONTRACTOR |    0 | 
| EMPLOYEE |    0 | 

Demo.

Смежные вопросы