0

ブック(B_IDはPK)乗算2つの異なるテーブルからの値と新しいテーブルに結果を格納

| B_ID | Name | Unit_Price| 
|------+---------+-----------| 
| B01 | Math |  25 | 
| B02 | Science |  34 | 

注文(O_IDがPKである)

| O_ID | Date | Total_Price | 
|------+---------+-------------| 
| O01 | 12/1/16 | NULL  | 
| O02 | 20/3/16 | NULL  | 

注文Detais(O_ID、B_IDはコンポジットPKであり、両方のIDが上記の表に対してFKです)

| O_ID | B_ID | Quantity | 
|------+------+-----------| 
| O01 | B01 |  2  | 
| O01 | B02 |  1  | 
| O02 | B02 |  5  | 

Total_PriceUnit_Price * Quantity)に計算を挿入するには、NULLを計算結果に置き換えます。私はCTEを使って解決しようとしましたが、新しいレコード(Exp:O03)が追加されたときにCTEを再度実行して更新する必要があるのは嫌です。 @Damienによってコメントに続き

+1

計算値を保存すると、保存され計算された値が元の基本データと矛盾する機会が*導入*されます。理想的には、オンデマンドでの計算(必要に応じてロジックをビューに入れる)が不十分であることが証明されるまで、またはその値が格納されないようにしてください。 *次に*値を格納することを検討しますが、可能であれば、データベースシステムがその値を自動的に保持していることを確認するために、再計算を覚えておく必要はありません。 –

答えて

0

、あなたは計算値を格納しないことにした場合、その後、あなたは各注文の合計金額を計算するために、次のクエリを使用して試すことができます:

SELECT o.O_ID, 
     SUM(od.Quantity * b.Unit_Price) AS Total_Price 
FROM Order o 
LEFT JOIN Order_Details od 
    ON o.O_ID = od.O_ID 
LEFT JOIN Book b 
    ON od.B_ID = b.B_ID 
GROUP BY o.O_ID 
0

私はあなたから持ってcolud推測を

create table book (b_id char(10),name char(20),Unit_Price int) 
create table orders(o_id char(10),Date varchar(10),Total_Price int) 
Create table Order_details(o_id char(10),b_id char(10),quantity int) 

insert into book values ('B01','Math' ,25); 
insert into book values ('B02','Science',34); 

INSERT INTO orders values ('O01','12/1/16',NULL)          
INSERT INTO orders values ('O02','20/3/16',NULL) 

Insert into order_details values('O01','B01',2); 
Insert into order_details values('O01','B02',1); 
Insert into order_details values('O02','B02',5); 




declare @total int, @o_id char(10) 

declare c cursor for 
select sum(a.unit_price * b.quantity),b.o_id from book a join order_details b on a.b_id=b.b_id group by b.o_id 
open c 
fetch next from c into @total,@o_id 
while @@FETCH_STATUS=0 
begin 
update orders set [email protected] where [email protected]_id 
fetch next from c into @total,@o_id 
end 
close c 
deallocate c 

select * from orders 
+0

order_details(Order_detailsの値( 'O02'、 'B01'、1)に挿入)に新しいレコードを追加しようとしましたが、(* selectから*を選択して)計算結果が更新されませんでした。 – Hidden

関連する問題