Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何编写有关计算库存中的总价的存储过程_Sql Server - Fatal编程技术网

Sql server 如何编写有关计算库存中的总价的存储过程

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

我是个新手,正在学习微软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    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在问题的任何地方提到只需要单个字符的数据。但是,如果他们