如何将选定的总和和其他信息插入表?

时间:2019-04-23 08:54:19

标签: sql postgresql

我需要将新项目帐单添加到具有

的帐单表中
  1. 所有工作时间的总和乘以小时工资乘以折扣 和
  2. 所有设备售价的总和乘以其折扣乘以其数量 和
  3. 列表项

    也是项目的主键。

这是我的桌子:

CREATE TABLE labourtype (
lkey SERIAL PRIMARY KEY,
ltype VARCHAR(20),
hourwage DECIMAL);


CREATE TABLE project (
pkey SERIAL PRIMARY KEY,
ptype VARCHAR(20),
p_finished DATE,
has_been_paid INT DEFAULT 0);


CREATE TABLE equipment (
ekey SERIAL PRIMARY KEY,
ename VARCHAR(50) NOT NULL UNIQUE,
purchase_price DECIMAL NOT NULL,
in_stock INT DEFAULT 0);


CREATE TABLE labour_in_project (
lkey INT NOT NULL,
pkey INT NOT NULL,

workday DATE DEFAULT CURRENT_DATE,
workhours INT,
discount DECIMAL,

PRIMARY KEY(lkey, pkey, workday),
FOREIGN KEY (lkey) REFERENCES labourtype(lkey),
FOREIGN KEY (pkey) REFERENCES project(pkey));


CREATE TABLE equipments_used(
pkey INT NOT NULL,
ekey INT NOT NULL,
sold DATE DEFAULT CURRENT_DATE,

quantity int,
selling_price DECIMAL,
discount DECIMAL,

PRIMARY KEY(pkey, ekey, sold),
FOREIGN KEY (pkey) REFERENCES project(pkey),
FOREIGN KEY (ekey) REFERENCES equipment(ekey));


CREATE TABLE bill (
bkey SERIAL PRIMARY KEY,
pkey INT NOT NULL,
labour_price DECIMAL,
equipment_price DECIMAL,
FOREIGN KEY (pkey) REFERENCES project(pkey));

以下是艰苦而艰苦的劳动总成本的选择:

SELECT SUM(price) AS workprice
FROM (SELECT labourtype.hourwage * lip.discount * lip.workhours as price
FROM labourtype INNER JOIN labour_in_project AS lip
    ON labourtype.lkey = lip.lkey AND pkey = 1) AS priceoflabour;

这是我们设备成本的选择:

SELECT SUM(price) AS equipmentprice
FROM (SELECT eu.quantity * eu.selling_price * eu.discount as price
    FROM equipments_used AS eu
    WHERE eu.pkey = 1) AS equipment_costs;

现在我需要做的就是在票据表中插入工作价格,设备价格和pkey 1。该怎么做?

1 个答案:

答案 0 :(得分:0)

如果只想对pkey 1执行此操作,则解决方案非常明显:

INSERT INTO
    bill (pkey, labour_price, equipmentprice)
VALUES
(1,
 (SELECT
      SUM(llp.price)
  FROM
      (SELECT
               labourtype.hourwage * lip.discount * lip.workhours AS price
       FROM
           labourtype
               INNER JOIN labour_in_project AS lip
                          ON labourtype.lkey = lip.lkey AND pkey = 1) AS llp),
 (SELECT
      SUM(ep.price)
  FROM
      (SELECT
               eu.quantity * eu.selling_price * eu.discount AS price
       FROM
           equipments_used AS eu
       WHERE eu.pkey = 1) AS ep));

您可以编写一个以pkey作为参数的函数,并对给定的pkey进行上述插入。

您也可以使用INSERT INTO SELECT对所有pkey执行此操作:

INSERT INTO
    bill (pkey, labour_price, equipment_price)
SELECT
    p.pkey                                                                            AS pkey,
    (SELECT
         SUM(llp.price)
     FROM
         (SELECT
              labourtype.hourwage * lip.discount * lip.workhours AS price
          FROM
              labourtype
                  INNER JOIN labour_in_project AS lip
                             ON labourtype.lkey = lip.lkey AND pkey = p.pkey) AS llp) AS workprice,
    (SELECT
         SUM(ep.price)
     FROM
         (SELECT
              eu.quantity * eu.selling_price * eu.discount AS price
          FROM
              equipments_used AS eu
          WHERE eu.pkey = p.pkey) AS ep)                                              AS equipmentprice
FROM
    project p;