在三个表上使用sql联接
我有3个表维护每个产品/项目的库存条目。这三个表如下所示:在三个表上使用sql联接,sql,sql-server,sql-server-2012,inner-join,Sql,Sql Server,Sql Server 2012,Inner Join,我有3个表维护每个产品/项目的库存条目。这三个表如下所示: Table : ItemStock (to maintain remaining stock of each item) Id ItemId OpgQty BranchID CurrentStock 1 7 0 1 8 2 7 0 2 3 3 6 0 1 2 4
Table : ItemStock (to maintain remaining stock of each item)
Id ItemId OpgQty BranchID CurrentStock
1 7 0 1 8
2 7 0 2 3
3 6 0 1 2
4 6 0 2 0
Table : ItemPurchase (StockIn)
Id ItemId Qty BranchID
1 7 5 1
2 7 4 2
3 7 6 1
4 7 2 2
5 6 4 1
6 6 2 2
7 6 2 1
表:项目销售(缺货)
所需输出(基于sql查询)我想得到如下结果:(报告的一部分)
我试图得到想要的结果,但没能做到。请帮忙 使用
groupby
和聚合的两个子查询将得到您想要的结果
select
s.*,
coalesce([ip].StockIn, 0) as StockIn, -- In case of no records in ItemPurchase or ItemSale, coalesce is neccessary.
coalesce([is].StockOut, 0) as StockOut
from ItemStock s
left join (
select sum(Qty) as StockIn, ItemId, BranchId
from ItemPurchase
group by ItemId, BranchId
) [ip] on s.ItemId = [ip].ItemId and s.BranchId = [ip].BranchId
left join (
select sum(Qty) as StockOut, ItemId, BranchId
from ItemSale
group by ItemId, BranchId
) [is] on s.ItemId = [is].ItemId and s.BranchId = [is].BranchId
请参见sqlfiddle中的内容。两个子查询和
分组依据和聚合将得到您想要的结果
select
s.*,
coalesce([ip].StockIn, 0) as StockIn, -- In case of no records in ItemPurchase or ItemSale, coalesce is neccessary.
coalesce([is].StockOut, 0) as StockOut
from ItemStock s
left join (
select sum(Qty) as StockIn, ItemId, BranchId
from ItemPurchase
group by ItemId, BranchId
) [ip] on s.ItemId = [ip].ItemId and s.BranchId = [ip].BranchId
left join (
select sum(Qty) as StockOut, ItemId, BranchId
from ItemSale
group by ItemId, BranchId
) [is] on s.ItemId = [is].ItemId and s.BranchId = [is].BranchId
请参见sqlfiddle。试试这个;
试试这个;
请
... 我希望你也考虑一下。
... 我希望你也考虑这个问题。 < P>一个非常简单的给出了预期结果的查询是:
select *,
(select sum(Qty)
from ItemPurchase
where ItemPurchase.ItemId = ItemStock.ItemId and
ItemPurchase.BranchId = ItemStock.BranchId) as StockIn,
(select sum(Qty)
from ItemSale
where ItemSale.ItemId = ItemStock.ItemId and
ItemSale.BranchId = ItemStock.BranchId) as StockOut
from ItemStock
提供所需结果的一个非常简单的查询是:
select *,
(select sum(Qty)
from ItemPurchase
where ItemPurchase.ItemId = ItemStock.ItemId and
ItemPurchase.BranchId = ItemStock.BranchId) as StockIn,
(select sum(Qty)
from ItemSale
where ItemSale.ItemId = ItemStock.ItemId and
ItemSale.BranchId = ItemStock.BranchId) as StockOut
from ItemStock
你试过什么了吗?你试过什么了吗?这回答了你的问题@VivekI说@vivek应该试试你的答案,因为它得到了想要的结果。@ErsinGülbahar我在你的答案中没有看到ItemSale表的用法。不确定,如果不使用ItemSale表记录,它将如何正确工作。@vivek bacause sale=in-current这回答了您的问题@VivekI说@vivek应该试试你的答案,因为它得到了想要的结果。@ErsinGülbahar我在你的答案中没有看到ItemSale表的用法。不确定,如果不使用ItemSale表记录,它将如何正常工作。@vivek bacause sale=in-current无法在实际条目上获得所需的结果。对于同一项和分支,我得到了多条记录。@vivek我们无法看到您的实际条目,因此我们也无法找出哪里出错,此sql将根据您的示例数据获得结果。或者你最好发布你真正想要的。在实际输入中没有得到想要的结果。对于同一项和分支,我得到了多条记录。@vivek我们无法看到您的实际条目,因此我们也无法找出哪里出错,此sql将根据您的示例数据获得结果。或者你最好发布你真正想要的。在实际输入中没有得到想要的结果。我获得了同一项目和分支的多个记录。仍然在寻找问题所在。@vivek我的脚本看起来像得到了您想要的输出。实际输入没有得到想要的结果。我获得了同一项目和分支的多个记录。仍然在寻找问题所在。@vivek我的脚本看起来像得到了您想要的输出。
select *,
(select sum(Qty)
from ItemPurchase
where ItemPurchase.ItemId = ItemStock.ItemId and
ItemPurchase.BranchId = ItemStock.BranchId) as StockIn,
(select sum(Qty)
from ItemSale
where ItemSale.ItemId = ItemStock.ItemId and
ItemSale.BranchId = ItemStock.BranchId) as StockOut
from ItemStock