对相关模型

时间:2015-06-01 18:02:21

标签: sql postgresql

我在查询此任务时遇到了一些麻烦。有人请帮助我。

  • 汽车(牌照,品牌,年份);
  • 员工(EID,名字,姓氏,工资);
  • 客户(CID,名字,姓氏,电话);
  • OfficeStaff(EID,OfficeNumber);
  • 拥有(CID,许可证);
  • 机械师(EID,HourlyPrice);
  • 维修(许可证,EID,PartCost,小时);

创建执行以下任务的SQL语句:

(a)创建OfficeStaff表,同时考虑到OfficeNumber可能不是NULL并且必须在 范围[1..10]。

(b)查找已经修复的汽车所有者的名称,即名字和姓氏。 最多次。

(c)找出修理“欧宝”牌汽车的平均花费小时数(即Repairs.Hours)。

(d)对于工资为100欧元或以上的所有机械师,将每小时价格更新为20欧元。

我的尝试: (a)创建OfficeStaff表,同时考虑到OfficeNumber可能不是NULL并且必须在[1..10]范围内。

CREATE TABLE OfficeStaff (
 EID INT PRIMARY KEY,
 Firstname TEXT,
 Lastname TEXT,
 Wage REAL,
 OfficeNumber INT NOT NULL,
 CONSTRAINT CK_OfficeNumber CHECK (OfficeNumber BETWEEN 1 AND 10)

b)不知道?!

(c)找出修理“欧宝”牌汽车的平均花费小时数(即Repairs.Hours)。

SELECT AVG(R.Hours)
FROM Repairs R, Cars C
WHERE R.License = C.License AND C.Brand = “Opel”

(d)对于工资为100欧元或以上的所有机械师,将每小时价格更新为20欧元。

UPDATE Mechanic
SET HourlyPrice = 20
WHERE Wage >= 100

1 个答案:

答案 0 :(得分:0)

(a)如何创建可以查看here

CREATE TABLE OfficeStaff (
 EID INT PRIMARY KEY,
 Firstname varchar(100),
 Lastname varchar(100),
 Wage decimal(15,2),
 OfficeNumber INT NOT NULL,
 CONSTRAINT CK_OfficeNumber CHECK (OfficeNumber BETWEEN 1 AND 10)
 )

(b)对此不确定,但您必须使用rank来获取相同值中的1个值。为此,您可以查看here

    WITH cte AS (
   SELECT a.Firstname, a.Lastname, rank() OVER (ORDER BY count(c.Hours)) AS rnk
   from Customers as a
   join Own as b
   on a.CID=b.CID
   join Repairs as c
   on b.License = c.License
   group by a.Firstname, a.Lastname
   )
SELECT *
FROM   cte
WHERE  rnk <= 1;

(c)加入使用here

SELECT AVG(R.Hours)
FROM Repairs R
 join Cars C
 on R.license=C.license
WHERE C.Brand = 'Opel'

(d)更新使用情况herehere

UPDATE Mechanic
    SET HourlyPrice = 20
    from Employees
    WHERE Mechanic.EID = Employees.EID
    AND Employees.Wage >= 100