查询中每一行的总和

时间:2016-03-04 15:12:47

标签: sql sql-server

我有这个查询,它显示了我们的项目,其中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

修改

我通过OITWOBIN表连接到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约束或任何内容。

2 个答案:

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