【问题标题】:SQL The multi-part identifier "AVG.Hours" could not be boundSQL 无法绑定多部分标识符“AVG.Hours”
【发布时间】:2019-03-11 03:29:07
【问题描述】:

我试图找出部门的最大平均小时数,并显示最高小时数的员工姓名。

但是,我并不真正理解这个问题;这个问题要我首先找出哪个部门在项目中花费的时间最多,然后找到该部门为所有项目工作的员工

SELECT e.Fname, e.Lname, MAX(AVG.Hours)
FROM EMPLOYEE AS e
INNER JOIN DEPARTMENT AS d ON e.Dno = d.Dnumber
INNER JOIN Project AS p ON p.Dnum = d.Dnumber
INNER JOIN WORKS_ON AS w ON w.Pno = p.Pnumber
GROUP BY e.Fname, e.Lname;

并得到这个错误:

消息 4104,第 16 级,状态 1,第 161 行
无法绑定多部分标识符“AVG.Hours”。

这是插入的表格和信息

CREATE TABLE EMPLOYEE 
(
    Fname VARCHAR(15) NOT NULL,
    Minit CHAR(1) NULL,
    Lname VARCHAR(15) NOT NULL,
    Ssn CHAR(9) NOT NULL,
    Bdate DATE NULL,
    Address VARCHAR(30) NULL,
    Sex CHAR(1) NULL,
    Salary DECIMAL(10, 2) NULL,
    Super_ssn CHAR(9) NULL,
    Dno INT NOT NULL,
    CONSTRAINT PK_EMPLOYEE PRIMARY KEY (Ssn),
    CONSTRAINT FK_EMPLOYEE_EMPLOYEE FOREIGN KEY (Super_ssn) REFERENCES EMPLOYEE (Ssn)
);

CREATE TABLE DEPARTMENT 
(
    Dname VARCHAR(15) NOT NULL,
    Dnumber INT NOT NULL,
    Mgr_ssn CHAR(9) NOT NULL,
    Mgr_start_date DATE NOT NULL,
    CONSTRAINT PK_DEPARTMENT PRIMARY KEY (Dnumber),
    CONSTRAINT FK_DEPARTMENT_EMPLOYEE FOREIGN KEY (Mgr_ssn) REFERENCES EMPLOYEE (Ssn)
);

ALTER TABLE EMPLOYEE 
    ADD CONSTRAINT FK_DEPARTMENT 
        FOREIGN KEY (Dno) REFERENCES DEPARTMENT (Dnumber);

CREATE TABLE DEPT_LOCATIONS 
(
    Dnumber INT NOT NULL,
    Dlocation VARCHAR(15) NOT NULL,
    CONSTRAINT PK_DEPT_LOCATIONS PRIMARY KEY (Dnumber, Dlocation),
    CONSTRAINT FK_DEPT_LOCATIONS_DEPARTMENT FOREIGN KEY (Dnumber) REFERENCES DEPARTMENT (Dnumber)
);

CREATE TABLE PROJECT 
(
    Pname VARCHAR(15) NOT NULL,
    Pnumber INT NOT NULL,
    Plocation VARCHAR(15) NULL,
    Dnum INT NOT NULL,
    CONSTRAINT PK_PROJECT PRIMARY KEY (Pnumber),
    CONSTRAINT UK_PROJECT UNIQUE (Pname),
    CONSTRAINT FK_PROJECT_DEPARTMENT FOREIGN KEY (Dnum) REFERENCES DEPARTMENT (Dnumber)
);

CREATE TABLE WORKS_ON 
(
    Essn CHAR(9) NOT NULL,
    Pno INT NOT NULL,
    Hours DECIMAL(3, 1) NULL,
    CONSTRAINT PK_WORKS_ON PRIMARY KEY (Essn, Pno),
    CONSTRAINT FK_WORKS_ON_EMPLOYEE FOREIGN KEY (Essn) REFERENCES EMPLOYEE (Ssn),
    CONSTRAINT FK_WORKS_ON_PROJECT FOREIGN KEY (Pno) REFERENCES PROJECT (Pnumber)
);

CREATE TABLE DEPENDENT 
(
    Essn CHAR(9) NOT NULL,
    Dependent_name VARCHAR(15) NOT NULL,
    Sex CHAR(1) NULL,
    Bdate DATE NULL,
    Relationship VARCHAR(8) NULL,
    CONSTRAINT PK_DEPENDENT PRIMARY KEY (Essn, Dependent_name),
    CONSTRAINT FK_DEPENDENT_EMPLOYEE FOREIGN KEY (Essn) REFERENCES EMPLOYEE (Ssn)
);

ALTER TABLE EMPLOYEE DROP CONSTRAINT FK_DEPARTMENT;

INSERT INTO EMPLOYEE (Fname, Minit, Lname, Ssn, Bdate, Address, Sex, Salary, Super_ssn, Dno) 
VALUES ('James', 'E', 'Borg', '888665555', '1937-11-10', '450 Stone, Houston, TX', 'M', 55000, NULL, 1),
       ('Franklin', 'T', 'Wong', '333445555', '1955-12-08', '638 Voss, Houston, TX', 'M', 40000, '888665555', 5),
       ('Jennifer', 'S', 'Wallace', '987654321', '1941-06-20', '291 Berry, Bellaire, TX', 'F', 43000, '888665555', 4),
       ('Alicia', 'J', 'Zelaya', '999887777', '1968-01-19', '3321 Castle, Spring, TX', 'F', 25000, '987654321', 4),
       ('Ahmad', 'V', 'Jabbar', '987987987', '1969-03-29', '980 Dallas, Houston, TX', 'M', 25000, '987654321', 4),
       ('John', 'B', 'Smith', '123456789', '1965-01-09', '731 Fonden, Houston, TX', 'M', 30000, '333445555', 5),
       ('Ramesh', 'K', 'Narayan', '666884444', '1962-09-15', '975 Fire Oak, Humble, TX', 'M', 38000, '333445555', 5),
       ('Joyce', 'A', 'English', '453453453', '1972-07-31', '5631 Rice, Houston, TX', 'F', 25000, '333445555', 5);

INSERT INTO DEPARTMENT (Dname, Dnumber, Mgr_ssn, Mgr_start_date) 
VALUES ('Research', 5, '333445555', '1988-05-22'),
       ('Administration', 4, '987654321', '1995-01-01'),
       ('Headquarters', 1, '888665555', '1981-06-19');

ALTER TABLE EMPLOYEE 
    ADD CONSTRAINT FK_DEPARTMENT 
        FOREIGN KEY (Dno) REFERENCES DEPARTMENT (Dnumber);

INSERT INTO DEPT_LOCATIONS (Dnumber, Dlocation) 
VALUES (1, 'Houston'), (4, 'Stafford'), (5, 'Bellaire'),
       (5, 'Sugarland'), (5, 'Houston');

INSERT INTO PROJECT (Pname, Pnumber, Plocation, Dnum) 
VALUES ('ProductX', 1, 'Bellaire', 5),
       ('ProductY', 2, 'Sugarland', 5),
       ('ProductZ', 3, 'Houston', 5),
       ('Computerization', 10, 'Stafford', 4),
       ('Reorganization', 20, 'Houston', 1),
       ('Newbenefits', 30, 'Stafford', 4);

INSERT INTO WORKS_ON (Essn, Pno, Hours) 
VALUES ('123456789', 1, 32.5),
       ('123456789', 2, 7.5),
       ('666884444', 3, 40.0),
       ('453453453', 1, 20.0),
       ('453453453', 2, 20.0),
       ('333445555', 1, 10.0),
       ('333445555', 2, 10.0),
       ('333445555', 3, 10.0),
       ('333445555', 10, 10.0),
       ('333445555', 20, 10.0),
       ('999887777', 30, 30.0),
       ('999887777', 10, 10.0),
       ('987987987', 10, 35.0),
       ('987987987', 30, 5.0),
       ('987654321', 30, 25.0),
       ('987654321', 20, 15.0),
       ('888665555', 20, NULL);

INSERT INTO DEPENDENT (Essn, Dependent_name, Sex, Bdate, Relationship) 
VALUES ('333445555', 'Alice', 'F', '1986-04-05', 'Daughter'),
       ('333445555', 'Theodore', 'M', '1983-10-25', 'Son'),
       ('333445555', 'Joy', 'F', '1958-05-03', 'Spouse'),
       ('987987987', 'Abner', 'M', '1942-02-28', 'Spouse'),
       ('123456789', 'Michael', 'M', '1988-01-04', 'Son'),
       ('123456789', 'Alice', 'F', '1988-12-30', 'Daughter'),
       ('123456789', 'Elizabeth', 'F', '1967-05-05', 'Spouse');

【问题讨论】:

  • 一些样本数据和预期结果会使这个问题更容易理解。如果我理解正确的话,听起来你可以用TOP 1 来做到这一点,但我不确定这是否是你的意思。例如SELECT TOP 1 e.Fname, e.Lname, AVG(Hours) FROM blah GROUP BY e.FName, e.LName ORDER BY AVG(Hours) DESC;
  • @ Lee David - 请分享表结构和预期输出以帮助您。目前,我在下面分享的解决方案基于我的假设,即您想要计算每个员工的平均小时数或最大小时数。如果这是您的要求,您可以使用我下面的更新查询,或者分享您想要实现/预期的结果。

标签: sql sql-server


【解决方案1】:

使用如下所述的 avg 函数

SELECT  tab.Fname ,tab.Lname, MAX(avgHours)
FROM
(
    SELECT e.Fname, e.Lname, AVG(Hours) AS avgHours
    FROM EMPLOYEE AS e
    INNER JOIN DEPARTMENT AS d ON e.Dno = d.Dnumber
    INNER JOIN Project AS p ON p.Dnum = d.Dnumber
    INNER JOIN WORKS_ON AS w ON w.Pno = p.Pnumber
    GROUP BY e.Fname, e.Lname
) AS Tab

【讨论】:

  • 您不能直接在另一个类似的聚合函数中使用聚合函数(除非使用OVER() 子句)。
【解决方案2】:
 with cte ( 
              SELECT e.Fname, e.Lname, AVG(Hours) AS avgHours, d.Dnumber as department
    FROM EMPLOYEE AS e
    INNER JOIN DEPARTMENT AS d ON e.Dno = d.Dnumber
    INNER JOIN Project AS p ON p.Dnum = d.Dnumber
    INNER JOIN WORKS_ON AS w ON w.Pno = p.Pnumber
    GROUP BY e.Fname, e.Lname
             )
select max(avgHours) from cte group by department

此公用表表达式是获取结果的另一种方式。

【讨论】:

    【解决方案3】:

    如果您想计算每个员工的最大工作时间,那么您的查询应该如下所示:

    SELECT e.Fname, e.Lname, MAX(Hours)
    FROM EMPLOYEE AS e
    INNER JOIN DEPARTMENT AS d ON e.Dno = d.Dnumber
    INNER JOIN Project AS p ON p.Dnum = d.Dnumber
    INNER JOIN WORKS_ON AS w ON w.Pno = p.Pnumber
    GROUP BY e.Fname, e.Lname;
    

    如果您想计算每个员工的平均小时数,那么您的查询应该如下所示:

    SELECT e.Fname, e.Lname, Avg(Hours)
    FROM EMPLOYEE AS e
    INNER JOIN DEPARTMENT AS d ON e.Dno = d.Dnumber
    INNER JOIN Project AS p ON p.Dnum = d.Dnumber
    INNER JOIN WORKS_ON AS w ON w.Pno = p.Pnumber
    GROUP BY e.Fname, e.Lname;
    

    【讨论】:

    • 实际上我不太明白的问题是找到在所有项目上工作的员工的姓名,这些项目由在项目上花费最多时间的部门控制。对我来说,我认为我需要找出在所有项目中工作的员工,并且需要按部门编写?
    • 上述查询将为您提供所有已离职并从事项目的员工以及所有项目的最大小时数。如果您想要每个部门的最大小时数,那么您还应该将部门包含在分组依据中,如果您想要每个项目的最大小时数,那么您应该将项目包含在分组依据中。您编写的查询给您一个错误,因为 avg.hours 不存在。 sql 试图查找“avg”作为不存在的表/视图名称或别名。我希望这会有所帮助。
    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多