2013-09-22 1 views
2

Целью этого запроса является найти среднее число сотрудников для каждой компании в моей базе данных. Вот то, что я в настоящее время для моего запроса, вместе с моим результатом:SQL-запрос, чтобы найти среднее число сотрудников для каждой компании в базе данных

create view Totals as 
((select distinct count(company_name) as TotalCompanies, company_name 
    from company 
    group by company_name) 
union 
(select distinct count(Lastname) as TotalEmps, company_name 
    from Works 
    group by company_name)); 


select avg(TotalCompanies) from Totals; 

--RESULT: 
AVG(TOTALCOMPANIES) 
2.777777777778 

В то время как я получил результат (так что я не думаю, что есть какая-либо ошибка синтаксиса), на основе фактических данных я введенному в мои таблицы, я не верю, что это значение верно.

Является ли то, что я делаю, по моему мнению, создание, даже доставляющее меня в подходящую точку, где я могу просто назвать среднюю функцию поля TotalCompanies этого вида? Мое намерение состояло в том, чтобы подсчитать всех сотрудников по имени компании в представлении, а затем в среднем эти значения ...

Для FYI я использую SQL для Oracle 11g R2, и вот моя первоначальная схема Я создаю запросы для:

create table Employee(
    Lastname varchar(10), 
    FirstName varchar(10), 
    MidInitial char(1), 
    gender  char(1), 
    street  varchar(10), 
    city  varchar(10), 
    primary key(Lastname, FirstName, MidInitial)); 

create table company(
    company_name varchar(20), 
    city varchar(10), 
    primary key(company_name)); 

create table Works(
    Lastname varchar(10), 
    FirstName varchar(10), 
    MidInitial char(1), 
    company_name varchar(20), 
    salary  numeric(8,2), 
    primary key(Lastname, FirstName, MidInitial, company_name), 
    foreign key(Lastname, FirstName, MidInitial) references Employee, 
    foreign key(company_name) references company); 

Спасибо за помощь!

+0

Я хотел бы также отметить, что ваша схема оставляет место для улучшения. Вам нужно ввести первичные и внешние ключи. Тогда вам не придется повторять полное имя сотрудника и название компании в «Works». Поскольку могут быть люди и компании с одинаковыми именами, ваши ключи не гарантируются ** уникальными **. –

ответ

0

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

Select 
    Avg(employeeCount) 
From (
    Select 
     company_name, 
     count(coalesce(w.LastName, w.FirstName, w.MidInitial)) employeeCount 
    From 
     company c 
      left outer join 
     works w 
      on c.company_name = w.company_name 
    Group By 
     company_name 
) x 

Это немного сложно иметь дело с компаниями, с 0 сотрудников, а также люди с нулем в качестве одного из своих имен (я не конечно, если Oracle фактически допускает это в столбцах первичного ключа, но определение, по-видимому, подразумевает это)

+0

Не должно быть сложным заниматься компаниями с 0 сотрудниками; это, безусловно, возможно в реальной жизни, оно будет работать со средним числом, и счет, который у вас здесь, даст вам 0 для этих компаний. Oracle не разрешает столбцы NULL в PK, хотя ... – Ben

+0

@Ben несколько сложнее, я имел в виду сложнее, чем притворяться, что этого не может быть, и просто используя таблицу 'works'. – Laurence

0

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

create view Totals as 
    (select count(*) as No_of_employees,company_name from Employee,Works 
    where Employee.Lastname = Works.Lastname and 
     Employee.FirstName = Works.FirstName and 
     Employee.MidInitial = Works.MidInitial 
    group by Works.company_name); 

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

select avg(No_of_employees) from Totals; 

Это должно дать вам правильный ответ. Я попробовал это с помощью MySQL. Простите меня за любые опечатки.

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