Sql server 如何编写有关计算库存中的总价的存储过程
我是个新手,正在学习微软SQL。我有这两张桌子Sql server 如何编写有关计算库存中的总价的存储过程,sql-server,Sql Server,我是个新手,正在学习微软SQL。我有这两张桌子 CREATE TABLE Char_item( char_id VARCHAR(5) NOT NULL REFERENCES Character(char_id) ON DELETE CASCADE ON UPDATE CASCADE, item_id VARCHAR(5) NOT NULL REFERENCES Item(item_id) ON DELETE CASCADE ON UPDATE CASCADE, item_qty
CREATE TABLE Char_item(
char_id VARCHAR(5) NOT NULL REFERENCES Character(char_id) ON DELETE
CASCADE ON UPDATE CASCADE,
item_id VARCHAR(5) NOT NULL REFERENCES Item(item_id) ON DELETE CASCADE ON
UPDATE CASCADE,
item_qty INTEGER NOT NULL CHECK(item_qty >= 0),
PRIMARY KEY(char_id, item_id)
);
CREATE TABLE Item(
item_id VARCHAR(5) NOT NULL UNIQUE,
item_name VARCHAR(20) NOT NULL UNIQUE,
item_desc VARCHAR(50) NOT NULL,
unit_price FLOAT NOT NULL,
armor_id VARCHAR(5) REFERENCES Armor(armor_id) ON DELETE CASCADE
ON UPDATE CASCADE,
weapon_id VARCHAR(5) REFERENCES Weapon(weapon_id) ON DELETE
CASCADE ON UPDATE CASCADE
);
char_item具有库存中每个项目的项目及其数量
而item table保存每个项目的单价
我想创建一个存储过程,帮助我获取整个库存的总价
使用SELECT item_id将一次性为我提供我不想要的所有item_id,因为这样我将无法计算库存中找到的每个特定项目的总价
我在考虑做一个循环,但我被困在了如何继续的问题上。这是一个非常基本的聚合。像这样的东西应该是你要找的。当你开始思考循环时……后退一步,重新思考,因为循环几乎总是不是你想做的
select TotalInventoryValue = SUM(ci.item_qty * i.unit_price)
from Item i
join Char_item ci on ci.item_id = i.item_id
这是相当基本的聚合。像这样的东西应该是你要找的。当你开始思考循环时……后退一步,重新思考,因为循环几乎总是不是你想做的
select TotalInventoryValue = SUM(ci.item_qty * i.unit_price)
from Item i
join Char_item ci on ci.item_id = i.item_id
首先,你需要做一个叫做连接的事情。您需要将Char_Item表中的行与Item表中相应的行对齐,以便同时获得数量和价格
SELECT * FROM Item
JOIN Char_item ON Char_item.item_id = Item.item_id
这将生成一个结果集,该结果集包含给定项目id的Char_item和item中的所有列。如下所示:
|char_id|item_id|item_qty|item_id|item_name|item_desc|unit_price|armor_id|weapon_id|
当然,您不需要所有这些列。对于库存中的每个项目,您只需要项目数量和单价:
SELECT Char_item.item_qty, Item.unit_price FROM Item
JOIN Char_item ON Char_item.item_id = Item.item_id
现在我们有了我们需要的所有数据。是时候计算我们想要什么了。让我们从计算每个项目的总价值开始
SELECT Char_item.item_qty * Item.unit_price FROM Item
JOIN Char_item ON Char_item.item_id = Item.item_id
我们更接近了,但我们想要的是所有物品的价值,而不仅仅是所有蓝色衬衫的价值,所以我们想要合计。我们能做的最简单的聚合之一就是求和,这正是我们想要的。它将沿着我们的行,把每一列加起来,形成一个总数
SELECT SUM(Char_item.item_qty * Item.unit_price) FROM Item
JOIN Char_item ON Char_item.item_id = Item.item_id
如果我们只有一个字符,这个查询就可以很好地工作。但是,如果我们有多个角色,它不会告诉我们一个角色库存的总价值。它告诉我们所有角色的总价值。我们可能应该缩小范围
SELECT Char_item.char_id, SUM(Char_item.item_qty * Item.unit_price) FROM Item
JOIN Char_item ON Char_item.item_id = Item.item_id
GROUP BY Char_item.char_id
这个新的查询告诉我们,对于每个字符,它们在库存中的总价值是多少。如果你想见到每个人,你可以看看这个结果。但也许你只是想要一个特定角色的清单。假设您感兴趣的角色是id为5的角色。我们可以告诉它,我们只需要字符5的库存项目
SELECT Char_item.char_id, SUM(Char_item.item_qty * Item.unit_price) FROM Item
JOIN Char_item ON Char_item.item_id = Item.item_id
WHERE Char_item.char_id = 5
GROUP BY Char_item.char_id
在本例中,由于只有一个char_id,我们不需要包含groupby,因此您可以去掉它,但我想通过示例包含groupby,以便您了解它是如何工作的
SELECT Char_item.char_id, SUM(Char_item.item_qty * Item.unit_price) FROM Item
JOIN Char_item ON Char_item.item_id = Item.item_id
WHERE Char_item.char_id = 5
我建议您运行这些不同的查询并探索它们产生的不同结果,以便查看您是否能够获得预期的结果 首先,您需要执行所谓的连接。您需要将Char_Item表中的行与Item表中相应的行对齐,以便同时获得数量和价格
SELECT * FROM Item
JOIN Char_item ON Char_item.item_id = Item.item_id
这将生成一个结果集,该结果集包含给定项目id的Char_item和item中的所有列。如下所示:
|char_id|item_id|item_qty|item_id|item_name|item_desc|unit_price|armor_id|weapon_id|
当然,您不需要所有这些列。对于库存中的每个项目,您只需要项目数量和单价:
SELECT Char_item.item_qty, Item.unit_price FROM Item
JOIN Char_item ON Char_item.item_id = Item.item_id
现在我们有了我们需要的所有数据。是时候计算我们想要什么了。让我们从计算每个项目的总价值开始
SELECT Char_item.item_qty * Item.unit_price FROM Item
JOIN Char_item ON Char_item.item_id = Item.item_id
我们更接近了,但我们想要的是所有物品的价值,而不仅仅是所有蓝色衬衫的价值,所以我们想要合计。我们能做的最简单的聚合之一就是求和,这正是我们想要的。它将沿着我们的行,把每一列加起来,形成一个总数
SELECT SUM(Char_item.item_qty * Item.unit_price) FROM Item
JOIN Char_item ON Char_item.item_id = Item.item_id
如果我们只有一个字符,这个查询就可以很好地工作。但是,如果我们有多个角色,它不会告诉我们一个角色库存的总价值。它告诉我们所有角色的总价值。我们可能应该缩小范围
SELECT Char_item.char_id, SUM(Char_item.item_qty * Item.unit_price) FROM Item
JOIN Char_item ON Char_item.item_id = Item.item_id
GROUP BY Char_item.char_id
这个新的查询告诉我们,对于每个字符,它们在库存中的总价值是多少。如果你想见到每个人,你可以看看这个结果。但也许你只是想要一个特定角色的清单。假设您感兴趣的角色是id为5的角色。我们可以告诉它,我们只需要字符5的库存项目
SELECT Char_item.char_id, SUM(Char_item.item_qty * Item.unit_price) FROM Item
JOIN Char_item ON Char_item.item_id = Item.item_id
WHERE Char_item.char_id = 5
GROUP BY Char_item.char_id
在本例中,由于只有一个char_id,我们不需要包含groupby,因此您可以去掉它,但我想通过示例包含groupby,以便您了解它是如何工作的
SELECT Char_item.char_id, SUM(Char_item.item_qty * Item.unit_price) FROM Item
JOIN Char_item ON Char_item.item_id = Item.item_id
WHERE Char_item.char_id = 5
我建议您运行这些不同的查询并探索它们产生的不同结果,以便查看您是否能够获得预期的结果 你所说的“我全部存货的总价”是什么意思?如果价格是由每件物品决定的,那么对于所有物品,您想将每件物品的价格乘以其数量之和?您所说的“我的整个存货的总价”是什么意思?如果价格是由每个项目决定的,那么对于所有项目,要将每个项目的价格乘以其数量求和吗?请注意此查询。如果有多个字符,这将不起作用,因为它将为您提供每个人的总库存值,而不仅仅是一个字符。@Dogs-我不理解您的担心。OP需要整个库存,而不是单个项目。第一个表的第一列是char_id,它引用了一个字符表。如果有5个字符,那么这些字符的所有5个项目都将在Char_item表中,而不仅仅是我们要查找的字符的项目。我没有看到OP在问题的任何地方提到只需要单个字符的数据。但是,如果他们