如何根据在其他列中找到的信息向表中添加列

时间:2017-07-29 17:26:23

标签: sql sql-server tsql

我希望能够在表中添加一列,但我需要这个新列来获取表中其他列的值。这是我的代码:

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中找到的值并将它们相乘。我可以在不必将值从一列转换为另一列的情况下执行此操作吗?感谢。

7 个答案:

答案 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;