Распечатать сообщение, когда данные не найдены - PullRequest
0 голосов
/ 13 июня 2019

Требуется запрос, чтобы получить имя сотрудника, общее количество топлива, используемого каждым сотрудником. Если работник не использует топливо, то во втором столбце должно быть текст «Топливо не используется».

Это следующие две таблицы:

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.ID является внешним ключом для table1.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 по 5 таблицы1 находится в таблице2. Поэтому для этих сотрудников мне нужно показать общее количество топлива, используемого каждым человеком. А для сотрудника с идентификатором от 6 до 14 нет в таблице 1, поэтому для этого сотрудника должно быть напечатано сообщение «Не используется топливо».

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Вы можете использовать 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

Демо

0 голосов
/ 13 июня 2019

Это может сработать ---

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...