На каждого работника сколько рабочих заказов они выполняли в 2018 году? - PullRequest
0 голосов
/ 02 марта 2020

Я все еще новичок в sql, и я пытаюсь выяснить для каждого сотрудника, сколько рабочих заказов они выполняли в 2018 году. У меня есть две таблицы tblWorkOrder и tblTimeCharge, которые оба связаны полем IDEmployee.

tblWorkOrder имеет столбец с именем DateCompleted, который позволяет узнать, когда форма рабочего задания была заполнена. Тем не менее, всякий раз, когда я запускаю свой код, я получаю сообщение об ошибке: нет column.tblWorder.DateCompleted.

Пример кода

SELECT tblEmployee.IDEmployee, tblEmployee.FirstName, COUNT(tblTimeCharge.IDWorkOrder)
FROM tblEmployee LEFT JOIN tblTimeCharge ON tblTimeCharge.IDEmployee = tblEmployee.IDEmployee 
GROUP BY tblEmployee.IDEmployee, tblEmployee.FirstName
Having tblWorkOrder.DateCompleted between '01/01/2018' and '12/31/2018';

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

CREATE TABLE tblEmployee(
  IDEmployee Integer NOT NULL Primary Key,
  LastName Text,
  FirstName Text,
  EmpNum Text,
  IDGender Integer,
  IDRace Integer,
  DOB Date,
  City Integer,
  State Text,
  TerminationDate Date,
  IDTerminationReason Date,
  Email Text,
  Phone Text,
  IDposition Integer,
  HireDate Date,
  Adjust Float,
  Foreign Key (IDGender) References tblGender(IDGender),
  Foreign Key (IDRace) References tblRace(IDRace),
  Foreign Key (IDTerminationReason) References tblTermination(IDTR),
  Foreign Key (IDPosition) References tblPosition(IDPosition)
);
CREATE TABLE tblTimeCharge (
  IDTimeCharger Integer NOT NULL Primary Key,
  IDWorkOrder Integer,
  IDEmployee Integer,
  TimeChargeHours Integer,
  TimeChargeDate Date,
  Foreign Key (IDWorkOrder) References tblWorkOrder(IDWorkOrder),
  Foreign Key (IDEmployee) References tblEmployee(IDEmployee)
);
CREATE TABLE tblWorkOrder (
  IDWorkOrder Integer NOT NULL Primary Key,
  WONNumber Integer,
  IDPriority Integer,
  IDCategory Integer,
  IDBldg Integer,
  Assigned Integer,
  DateAvailable Date,
  DateNeeded Date,
  DateCompleted Date,
  DateCreated Date,
  Foreign Key (IDPriority) References tblPriority(IDPriority),
  Foreign Key (IDCategory) References tblCategory(IDCategory),
  Foreign Key (IDBldg) References tblBuilding(IDBldg)
);

Ответы [ 3 ]

2 голосов
/ 02 марта 2020

Научитесь использовать псевдонимы таблиц! Они облегчают написание и чтение запроса!

SELECT e.IDEmployee, e.FirstName, COUNT(wc.IDWorkOrder)
FROM tblEmployee e LEFT JOIN 
     tblTimeCharge tc
     ON tc.IDEmployee = e.IDEmployee LEFT JOIN
     tblWorkCharge wc
     ON wc.IdWorkCharge= tc.WorkCharge AND
        wc.DateCompleted >= '2018-01-01' AND
        wc.DateCompleted < '2019-01-01' 
GROUP BY e.IDEmployee, e.FirstName;

Ключом здесь является сопоставление дат в предложении ON, поэтому LEFT JOIN не превращается во внутреннее соединение. Также обратите внимание на использование стандартных форматов даты.

0 голосов
/ 02 марта 2020

Используйте LEFT присоединиться так:

SELECT e.IDEmployee, e.FirstName, e.LastName,
  COUNT(t.IDWorkOrder)
FROM tblEmployee e 
LEFT JOIN tblTimeCharge t ON t.IDEmployee = e.IDEmployee 
LEFT JOIN tblWorkOrder w on w.IDWorkOrder = t.IDWorkOrder AND w.DateCompleted BETWEEN '2018-01-01' AND '2018-12-31'
GROUP BY e.IDEmployee, e.FirstName, e.LastName

Я предполагаю, что даты в вашей таблице имеют формат 'YYYY-MM-DD', который сопоставим, если нет, то вы должны изменить его.

0 голосов
/ 02 марта 2020

Это не то, что вы хотите, я верю:

Вы пропустили таблицу tblWorkOrder в вашем запросе

    SELECT tblEmployee.IDEmployee, tblEmployee.FirstName, 
    COUNT(tblTimeCharge.IDWorkOrder)
    FROM tblEmployee LEFT JOIN 
    tblTimeCharge ON tblTimeCharge.IDEmployee = tblEmployee.IDEmployee 
    inner join 
    tblWorkOrder  on tblTimeCharge.IDWorkOrder = tblWorkOrder.IDWorkOrder 
    GROUP BY tblEmployee.IDEmployee, tblEmployee.FirstName
    Having tblWorkOrder.DateCompleted between '01/01/2018' and '12/31/2018';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...