找不到数据时打印消息

时间:2019-06-13 06:40:56

标签: sql oracle

需要查询以获取员工姓名,即每个员工使用的总燃料。 如果员工不使用燃料,则第二列应有一个 文字“不使用燃料”。

以下是两个表:

Table1: EmployeeID, FirstName

1 Vikas
2 nikita
3 Ashish
4 Nikhil
5 anish
Table2: ID, Fuel

1 10
2 9
3 8
4 6
5 12
6 11
7 10
8 9
9 8
10 10
11 9
12 12
13 7
14 15

其中列table2.IDtable1.EmployeeID的外键。

这是我编写的代码,很可能是错误的。

select ID, FirstName, sum(table2.Fuel) sum_fuel
from table2,table1
where EmployeeID=ID IN (
select ID, coalesce(ID, 'No-fuel used') as ID
from table1 t1
left join table2 t2 on t2.ID = t1.EmployeeID
)
group by fuel
order by ID DESC;

从两个表中可以看到,表1中具有1到5的雇员在表2中。因此,对于这些员工,我需要显示每个人使用的总燃料。并且表1中没有ID为6至14的员工,因此应为这些员工打印“不使用燃料”消息。

2 个答案:

答案 0 :(得分:1)

您可以使用left join。这样,当表的ID值不匹配时,您将获得sum(fuel)值的空值,并将为'No fuel used'分配字符串sum_fuel使用nvl()函数创建列:

with table1( EmployeeID, FirstName ) as
(
 select 1,'Vikas'  from dual union all 
 select 2,'nikita' from dual union all 
 select 3,'Ashish' from dual union all 
 select 4,'Nikhil' from dual union all 
 select 5,'anish'  from dual union all 
 select 15,'pratteek'  from dual 
), table2( ID, Fuel ) as
(
 select 1, 10  from dual union all
 select 2, 9   from dual union all
 select 3, 8   from dual union all
 select 4, 6   from dual union all
 select 5, 12  from dual union all
 select 6, 11  from dual union all
 select 7, 10  from dual union all
 select 8, 9   from dual union all
 select 9, 8   from dual union all
 select 10, 10 from dual union all
 select 11, 9  from dual union all
 select 12, 12 from dual union all
 select 13, 7  from dual union all
 select 14, 15 from dual       
)
select EmployeeID, FirstName, nvl(to_char(sum(t2.Fuel)),'No fuel used') as sum_fuel 
  from table1 t1
  left join table2 t2 
    on t1.EmployeeID = t2.ID 
 group by EmployeeID, FirstName
 order by EmployeeID desc;

 EMPLOYEEID FIRSTNAME   SUM_FUEL
 ---------- ---------   ------------
 15         pratteek    No fuel used
  5         anish       12
  4         Nikhil      6
  3         Ashish      8
  2         nikita      9
  1         Vikas       10

Demo

答案 1 :(得分:0)

这可能有效---

SELECT ID
     , FirstName
     , CASE 
               WHEN SUM(f.Fuel) > 0 THEN  CAST(SUM(f.Fuel)  AS NVARCHAR(25))
               ELSE 'No fuel used'
      END sum_fuel

FROM #emp e
LEFT JOIN #fuel f ON e.EmployeeID = f.id
GROUP BY ID,FirstName
ORDER BY ID DESC