我希望能够在表中添加一列,但我需要这个新列来获取表中其他列的值。这是我的代码:
CREATE TABLE grocery_price (id INTEGER PRIMARY KEY, name TEXT, price FLOAT);
INSERT INTO grocery_price VALUES(1, 'Bananas', 1.50);
INSERT INTO grocery_price VALUES(2, 'Peanut Butter', 1.00);
INSERT INTO grocery_price VALUES(3, 'Dark Chocolate Bars', 1.50);
INSERT INTO grocery_price VALUES(4, 'Ice cream', 2.50);
INSERT INTO grocery_price VALUES(5, 'Cherries', 0.50);
INSERT INTO grocery_price VALUES(6, 'Chocolate syrup', 1.25);
SELECT * FROM grocery_price
CREATE TABLE Grocery (id INTEGER PRIMARY KEY, name TEXT, quantity INTEGER, aisle INTEGER);
INSERT INTO Grocery VALUES(1, 'Bananas', 4, 7);
INSERT INTO Grocery VALUES(2, 'Peanut Butter', 1, 2);
INSERT INTO Grocery VALUES(3, 'Dark Chocolate Bars', 2, 2);
INSERT INTO Grocery VALUES(4, 'Ice cream', 1, 12);
INSERT INTO Grocery VALUES(5, 'Cherries', 6, 2);
INSERT INTO Grocery VALUES(6, 'Chocolate syrup', 1, 4);
SELECT * FROM Grocery
我想在Grocery中创建一个名为total price的新列,它将获取在grocery_price.price和Grocery.quantity中找到的值并将它们相乘。我可以在不必将值从一列转换为另一列的情况下执行此操作吗?感谢。
答案 0 :(得分:0)
将新列添加到表中。
alter TABLE Grocery add totalPrice FLOAT;
通过创建两个表的连接并将总价设置为数量和价格的乘积来更新表。
UPDATE Grocery gr
INNER JOIN grocery_price gp ON gr.id = gp.id
SET gr.totalPrice = CAST(gr.quantity as float) * gp.price;
答案 1 :(得分:0)
您是要创建计算列还是仅将total
列填充为一次性活动?
对于创建列后的一次性活动,您只需更新它:
Update Grocery
Set total = cast(g.quantity as float)*p.price
From grocery g
Inner join grocery_price p
On g.name = p.name...
您似乎在grocery_price
表格中没有公共参考列...
答案 2 :(得分:0)
如果这是一次性活动,您可以执行UPDATE
:
UPDATE Grocery tb_gr
INNER JOIN grocery_price tb_gp ON tb_gr.id = tb_gp.id
SET tb_gr.totalPrice = tb_gr.quantity * tb_gp.price;
如果定期刷新表的值,您可以在此表上创建一个视图并执行UPDATE
。
答案 3 :(得分:0)
我建议你为表选择更有意义的名称并将它们标准化(尽可能不重复数据)。还通过使用外键链接表。做完这些事后你的sql会是这样的。
CREATE TABLE product (id INTEGER PRIMARY KEY, name TEXT, price FLOAT);
INSERT INTO product VALUES(1, 'Bananas', 1.50);
INSERT INTO product VALUES(2, 'Peanut Butter', 1.00);
INSERT INTO product VALUES(3, 'Dark Chocolate Bars', 1.50);
INSERT INTO product VALUES(4, 'Ice cream', 2.50);
INSERT INTO product VALUES(5, 'Cherries', 0.50);
INSERT INTO product VALUES(6, 'Chocolate syrup', 1.25);
SELECT * FROM product;
CREATE TABLE product_inventory (
id INTEGER PRIMARY KEY,
product_id INTEGER REFERENCES product (id),
quantity INTEGER,
aisle INTEGER,
total_price FLOAT);
INSERT INTO product_inventory VALUES(1, 1, 4, 7);
INSERT INTO product_inventory VALUES(2, 2, 1, 2);
INSERT INTO product_inventory VALUES(3, 3, 2, 2);
INSERT INTO product_inventory VALUES(4, 4, 1, 12);
INSERT INTO product_inventory VALUES(5, 5, 6, 2);
INSERT INTO product_inventory VALUES(6, 6, 1, 4);
update product_inventory as pi1 set total_price = (select p.price * pi.quantity as total from product p join product_inventory pi on p.id = pi.product_
id where p.id = pi1.id );
SELECT * FROM product_inventory;
update语句在product_inventory表中设置total_price字段。
答案 4 :(得分:0)
select g.id, g.name, g.quantity, g.aisle, (g.quantity*gp.price) AS total_price
from grocery g left join grocery_price gp
on g.id=gp.id;
答案 5 :(得分:0)
是的,您可以创建一个新列并对其进行更新以包含您想要的信息,但更好的方法是让独立数据保持独立。< / p>
实际上,您的数据甚至不是独立的,因为您正在重复这个名称。所以从第二个表中删除该列。
然后,如果您需要在单个表中显示所有信息,请使用视图。
CREATE VIEW groceries_with_totals
AS
SELECT
gp.id,
gp.name,
gp.price,
g.quantity,
g.quantity * gp.price AS total_price,
g.aisle
FROM grocery_price gp
JOIN grocery g ON gp.id = g.id;
我在此假设grocery_price.id
引用grocery.id
;你应该添加一个反映这种关系的外键约束。
答案 6 :(得分:0)
最好的解决方案是使用其他人提到过的更新/视图。只有替代方案就是这样:
select g.id,g.name,g.quantity,g.aisle,price*quantity as total_price
into #temp
from grocery_price p join grocery g
on p.id=g.id;
drop table grocery;
select * into grocery from #temp;