2016-10-07 72 views
1

我有这个疑问,你可以看到:嵌套组在SQL Server

SELECT 
    [LineId] 
    ,[TestPackageId] 
    ,[MaterialDescriptionId] 
    ,isnull(sum([RequestQuantity]),0) as TotalMRC 
    ,isnull(sum([QuantityDeliver]),0) TotalMIV 
    ,isnull(sum([QuantityDeliverToMember]),0) totalIMIV 
    ,isnull(sum([QuantityDeliver]),0) - isnull(sum([QuantityDeliverToMember]),0) as Warehouse 
FROM 
    [SPMS2].[dbo].[ViewMTO2] 
GROUP BY 
    [LineId], [TestPackageId], [MaterialDescriptionId] 

结果是:

lindid tp  matDes mrc miv imiv warehouse 
101973 7927 61075 2 2 0  2 
101991 8666 70721 1 1 0  1 
102052 8751 71008 48 16 0  16 
99626 8053 61075 0 0 0  0 

问题是仓库的该值为false .The仓库值只需计算MaterialDescriptionId仓库的值应该如下计算:TotalMIV-totalIMIV不是针对每个行([LineId],[TestPackageId],[MaterialDescriptionId])每个MaterialDescriptionId的真实结果是

lindid tp  matDes mrc miv imiv warehouse 
101973 7927 61075 2 2 0  2 
101991 8666 70721 1 1 0  1 
102052 8751 71008 48 16 0  16 
99626 8053 61075 0 0 0  2 

正如你可以看到这两个项目61075应该是2.因为它是根据MaterialDescriptionId计算。

我该如何在查询中做到这一点?

这里是我的viewmto2结果(空值为零)

enter image description here

+0

您是否可以在分组前通过 –

+0

@Prdp添加'ViewMTO2'表格的样本数据'当您说'warehouse'基于'matDesc'时,请参阅更新亲爱的 –

+0

,这会使结果集有点混乱。由于您的结果集基于所有3个字段,但您希望仓库仅基于1,因此您必须确保当用户在单独的行上看到2和2时,他们明白该“matDesc”值的“总数”真的是2而不是4,这对你的用户来说会清楚吗? – SlimsGhost

回答

1

您可以使用独立的子查询计算仓库:

SELECT 
    [LineId] 
    ,[TestPackageId] 
    ,[MaterialDescriptionId] 
    ,isnull(sum([RequestQuantity]),0) as TotalMRC 
    ,isnull(sum([QuantityDeliver]),0) TotalMIV 
    ,isnull(sum([QuantityDeliverToMember]),0) totalIMIV 
    ,(select isnull(sum(b.[QuantityDeliver]),0) from viewmto2 b where b.[MaterialDescriptionId] = a.[MaterialDescriptionId]) - 
    (select isnull(sum(b.[QuantityDeliverToMember]),0) from viewmto2 b where b.[MaterialDescriptionId] = a.[MaterialDescriptionId]) as Warehouse 
FROM 
    [SPMS2].[dbo].[ViewMTO2] a 
GROUP BY 
    [LineId], [TestPackageId], [MaterialDescriptionId] 
0

看起来像你需要一个子查询计算分组仓库值由MaterialDescriptionId

SELECT 
    a.[LineId] 
    ,a.[TestPackageId] 
    ,a.[MaterialDescriptionId] 
    ,isnull(sum(a.[RequestQuantity]),0) as TotalMRC 
    ,isnull(sum(a.[QuantityDeliver]),0) TotalMIV 
    ,isnull(sum([a.QuantityDeliverToMember]),0) totalIMIV 
    ,b.Warehouse 
FROM 
    [SPMS2].[dbo].[ViewMTO2] as a 
INNER JOIN 
    (SELECT 
    MaterialDescriptionId, isnull((QuantityDeliver) - sum(QuantityDeliverToMember),0) as Warehouse 
    FROM [SPMS2].[dbo].[ViewMTO2] 
    GROUP BY MaterialDescriptionId) as b 
ON 
a.MaterialDescriptionId = b.MaterialDescriptionId 
GROUP BY 
    a.[LineId], a.[TestPackageId], a.[MaterialDescriptionId], b.Warehouse