我有这个查询,它显示了我们的项目,其中store和bin包含该项目。
SELECT
o.ItemCode,...,i.OnHand, i.IsCommited, i.OnOrder
FROM [dbo].[OITM] as o
LEFT JOIN [dbo].[OITW] as i
ON o.ItemCode=i.ItemCode
LEFT JOIN [dbo].[OBIN] as b
ON i.DftBinAbs = b.AbsEntry
WHERE
i.DftBinAbs IS NOT NULL
一个结果行:
90245 XYITEM AV1-14-7 db KÖZ-BAL-A-02-01 10 1 3
含义:在存放XYITEM物品的KÖZ-BAL-A-02-01垃圾箱中,我们有10个商店,1个待售/提交和3个已经订购的商品。太好了,但我会还要列出其他仓库和箱柜中的所有物品。 OITM表包含ITEMS,OITW包含仓库,OBIN是仓库中的箱。现在它每个仓库和每个箱子多次列出项目,但这不是问题。我需要看到每一行的项目总和。 喜欢如果:
90245 XYITEM AV1-14-7 db KÖZ-BAL-A-02-01 10 1 3
90245 XYITEM AV1-14-7 db KÖZ-BAL-A-02-02 3 1 0
结果是,我想这样:
90245 XYITEM AV1-14-7 db KÖZ-BAL-A-02-01 10 1 3 13 2 3
90245 XYITEM AV1-14-7 db KÖZ-BAL-A-02-02 3 1 0 13 2 3
所以它总结了OnHand,IsCommited和OnOrder字段。
13因为:10 + 3,2:1 + 1和3:3 + 0
修改:
我通过OITW
将OBIN
表连接到OITW.DftBinAbs = OBIN.AbsEntry
表,但大多数情况下,OITW
表如下所示:
ItemCode DftBinAbs OnHand IsCommited OnOrder
23668 NULL 50 0 0
23668 57 0 0 0
23668 NULL 0 0 0
23668 NULL 0 0 0
我在答案中得到的查询返回23668
的一行,这没关系,因为只有一行包含DftBinAbs
连接,但当我想要它们时,TotalSum都是0适用于OnHand:50 + 0 + 0 + 0,IsComited:0,OnOrder:0
问题是:我想计算总计中的i.DftBinAbs = NULL
行,但要隐藏结果。如果我使用Tom H的解决方案:
SELECT
O.ItemCode,
I.OnHand,
I.IsCommitted,
I.OnOrder,
SUM(I.OnHand) OVER (PARTITION BY O.ItemCode) AS TotalOnHand,
SUM(I.IsCommitted) OVER (PARTITION BY O.ItemCode) AS TotalCommitted,
SUM(I.OnOrder) OVER (PARTITION BY O.ItemCode) AS TotalOnOrder
FROM
dbo.OITM O
LEFT OUTER JOIN dbo.OITW I ON I.ItemCode = O.ItemCode
INNER JOIN dbo.OBIN B ON B.AbsEntry = I.DftBinAbs
它返回所有行(8000+)并且总计数没问题,如果我添加
WHERE
i.DftBinAbs IS NOT NULL
条件我得到133行(我想要的),但是Total只包含非空DftBinAbs
的行。
此外,它是SAP Business One数据库,因此没有FK约束或任何内容。
答案 0 :(得分:4)
您应该可以使用窗口函数执行此操作:
SELECT
O.ItemCode,
I.OnHand,
I.IsCommitted,
I.OnOrder,
SUM(I.OnHand) OVER (PARTITION BY O.ItemCode) AS TotalOnHand,
SUM(I.IsCommitted) OVER (PARTITION BY O.ItemCode) AS TotalCommitted,
SUM(I.OnOrder) OVER (PARTITION BY O.ItemCode) AS TotalOnOrder
FROM
dbo.OITM O
LEFT OUTER JOIN dbo.OITW I ON I.ItemCode = O.ItemCode
INNER JOIN dbo.OBIN B ON B.AbsEntry = I.DftBinAbs
答案 1 :(得分:0)
如下所示,你需要的只是一个交叉连接..我是为了测试而导出的。
select
a,b,c,d,e,f,b.*
from table
cross join
(select
sum(d) as g,sum(e) as h,sum(f)
as i from table)
b