【问题标题】:Calculate a total when creating a table using the attributes from another one使用另一个表的属性创建表时计算总计
【发布时间】:2018-07-14 13:24:03
【问题描述】:

我这样做了,它有效:

CREATE TABLE OrderLine 
(
    Invoice_ID varchar2(10) PRIMARY KEY NOT NULL,
    Item_ID varchar2(10) NOT NULL,
    Unit_Price number(6,2) NOT NULL,
    Quantity number(6) NOT NULL,
    Total_Price number(38,2) AS (CASE WHEN Quantity >= 50 THEN 
    ((Unit_Price*Quantity*0.80) ELSE (Unit_Price*Quantity) END),
    CONSTRAINT fk_item_invoice FOREIGN KEY(Invoice_ID) REFERENCES Invoice (Invoice_ID),
    CONSTRAINT fk_item_item FOREIGN KEY(Item_ID) REFERENCES Item (Item_ID),
    CONSTRAINT Unit_Price_CK CHECK (Unit_Price > 0),
    CONSTRAINT Quantity_CK CHECK (Quantity > 0),
);

CREATE TABLE Invoice 
(
     Invoice_ID varchar2(10) PRIMARY KEY NOT NULL,
     Office_ID varchar2(7) NOT NULL,
     Invoice_Date Date NOT NULL,
     Total_Cost number (9) NOT NULL,
     CONSTRAINT fk_order_Office FOREIGN KEY(Office_ID) REFERENCES Office (Office_ID),
     CONSTRAINT Total_Cost_CK CHECK (Total_Cost > 0)
);

我想在创建表时计算TotalCost,而不是通过查询来计算 TotalPrice(s) 的总和。这可能吗?

PS:我正在使用 SQL Developer。

【问题讨论】:

  • 你的问题毫无意义。查询是您从数据库中提取信息的方式。创建表时,总和为NULL,因为没有行。
  • 这是一个糟糕的设计。您已将业务规则(批量购买的折扣)硬编码到表的结构中。这是对虚拟列的非常糟糕的使用。除此之外,虚拟列是针对其表的列定义的:我们不能引用其他表上的列,这就是您需要对 TotalPrice 求和的。

标签: sql oracle


【解决方案1】:

我猜你想要的是在现有表上定义一个视图:

create or replace view v_invoice as
select i.invoice_id,
       i.office_id,
       i.invoice_date,
       i.total_cost,
       sum(l.total_price) as total_price,
       count(l.id) as lines
  from invoice i
       left join orderline l on l.invoice_id = i.invoice_id -- maybe "inner" join?
 group by i.invoice_id, i.office_id, i.invoice_date, i.total_cost
;

免责声明:我认为上述方法在 Oracle 中有效,但我手头没有可检查的实例

您可以将视图视为已保存的查询或“自动”表,并像这样使用它:

select * from v_invoice;

您缺少(至少)订单行的标识符(我猜应该称为“发票行”)。 :-)

【讨论】:

  • 这不适用于 Oracle,因为 Oracle 要求所有非聚合列都包含在 GROUP BY 子句中。
猜你喜欢
  • 2020-07-19
  • 1970-01-01
  • 2020-05-17
  • 2012-11-09
  • 2021-02-20
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多