Простая проблема SQL с объединением и группированием по - PullRequest
0 голосов
/ 08 июня 2019

Это схема моего БД

table emp
eid     ename   age salary
1000    Lakmal  33  90000
1001    Nadeeka 24  28000



 table works
    eid     did             percentage
    1000    Admin           40
    1000    ITSD            50
    1001    Admin           100
    1002    Academic        100
    1003    Academic        30

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

И это то, что я пытался

  select sum(w.pct_time) as 'Total' ,e.ename 
from emp e, works w
where w.eid = e.eid group by w.eid

и это не работает, я получаю эту ошибку

Column 'emp.ename' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Может кто-нибудь объяснить, как получить вышеуказанный вывод?

Ответы [ 3 ]

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

Исправьте предложение group by, как показано ниже.

select sum(w.pct_time) as 'Total' ,e.ename from emp e, works w where w.eid = e.eid group by e.ename

Примечание. Здесь я предполагаю, что имена уникальны, поскольку вам нужно только отобразить ename и pct_time. В противном случае это не даст правильных результатов, поскольку объединит результаты всех сотрудников с одинаковыми именами.

Если имена не уникальны, вы также можете добавить e.eid в предложение group by.

select sum(w.pct_time) as 'Total' ,e.ename from emp e, works w where w.eid = e.eid group by e.eid, e.ename
0 голосов
/ 08 июня 2019

Вот полный рабочий пример SQL Server с таблицами, преобразованными в обычные табличные выражения:

with [emp] (eid, ename, age, salary)
as
(
    select
        eid,     ename,   age, salary
    from
    (
        values 
            (1000 ,  ' Lakmal', 33,  90000),
            (1001 ,   'Nadeeka', 24,  28000)
    )  as result (eid,     ename,   age, salary)
),
[works] (eid, did, pct_time)
as
(
    select
        eid, did, percentage
    from
    (    
        values 
            (1000,    'Admin', 40),
            (1000,    'ITSD', 50),
            (1001,    'Admin', 100),
            (1002,    'Academic', 100),
            (1003,    'Academic', 30)
    )  as result(eid, did, percentage)
),
[grouped] (eid, pct)
as
(
    ' Do the grouping here.
    select
         e.eid, sum(w.pct_time) 
    from
       emp e
    inner join  
       works w on w.eid = e.eid
    group by
        e.eid
)
' And now you can join the grouped results with the employees to display the names
select 
   [w].pct as 'Total', e.ename 
from 
   [emp] e
inner join  
   [grouped] w on w.eid = e.eid;
0 голосов
/ 08 июня 2019

Это может использоваться для расчета процента

Select (Sum(pct_time)* 100 / (Select Sum(pct_time) From works)) as 'Total',
        e.ename, e.eid
  From emp e
  Join works w
    On e.eid = w.eid
 Group By e.ename, e.eid

с использованием внутреннего объединения достаточно, если все работающие люди включены в таблицу emp.Кажется, у вас есть все сотрудники, но некоторые рабочие записи для некоторых идентификационных номеров отсутствуют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...