Sql server 2008 如何在此表上使用group by

Sql server 2008 如何在此表上使用group by,sql-server-2008,Sql Server 2008,这是我桌子的屏幕截图 我正在尝试删除所有按销售合同\u nbr和名称进行分组时,PostAmt总和为0的行 例如: 当按名称分组时,销售合同编号51101008103将被删除,当合计金额为0时,销售合同编号为-96.83和96.83 很简单吧 但除此之外,我想要的是,我想要删除团队中的合同。我的意思是,如果合同5111008195被分组,那么它等于533.87,不会被删除(突出显示) 但我想分组删除它 比如说 两行合同编号5111008195应首先求和(见下图),我的意思是金额-533.87和

这是我桌子的屏幕截图

我正在尝试删除所有按销售合同\u nbr名称进行分组时,PostAmt总和为0的行

例如:

当按名称分组时,销售合同编号51101008103将被删除,当合计金额为0时,销售合同编号为-96.83和96.83

很简单吧

但除此之外,我想要的是,我想要删除团队中的合同。我的意思是,如果合同5111008195被分组,那么它等于533.87,不会被删除(突出显示)

但我想分组删除它

比如说 两行合同编号5111008195应首先求和(见下图),我的意思是金额-533.87533.87应求和,以得到0的总和。合同只应留下一份记录

更新

更多说明:

我要做的是首先将行号1和行号2分组(匹配一个正数和另一个负数),然后将其他行分组。如果有4行合同编号相同,则应将第1行和第2行分组,如果绝对金额相同,则应将第3行和第4行分组,如果没有删除第3行和第4行,则应将第3行和第4行分组

我想使用group by来消除总计为0且具有相同名称或合同号的行

我希望我已经把问题说清楚了。如果没有,请询问

怎样才能做到呢

我现在正在做的是:

SELECT sales_contract_nbr
,name
,SUM(PostAmt) PostAmt
FROM tblMasData 
GROUP BY sales_contract_nbr, name

谢谢。

以下是我目前的想法:

SELECT location
    ,sales_contract_nbr
    ,name
    ,SUM(absPostAmt * nbPostAmt) / ABS(SUM(nbPostAmt)) PostAmt
    ,ABS(SUM(nbPostAmt)) nbPostAmt
    ,SUM(absPostAmt * nbPostAmt) PostAmtTotal
FROM ( 
    SELECT location
        ,sales_contract_nbr
        ,name
        ,PostAmt
        ,ABS(PostAmt) absPostAmt
        ,SUM(CASE WHEN PostAmt >= 0 THEN 1 ELSE -1 END) nbPostAmt
    FROM tblMasData 
    GROUP BY location
        ,sales_contract_nbr
        ,name
        ,PostAmt
        ,ABS(PostAmt)
) t
GROUP BY location
    ,sales_contract_nbr
    ,name
    ,absPostAmt
HAVING SUM(absPostAmt * nbPostAmt) != 0

这并不能完全回答您的问题,例如,如果您有100+100-200,它不会隐藏所有三行。但在一堆行中找到等于0的组合可能会非常混乱

此外,如果某些行的数量相同,则将对它们进行分组。这就是为什么我添加了一列来计算相等的行数,并在末尾添加了一列对这些行求和

这至少应该允许您以编程方式处理数据


让我知道这是否满足您的需要,或者您是否需要一些改进(可能涉及一些不太漂亮的SQL)。

您问题的第二部分是什么意思?你能重新表述一下吗?第3行和第4行需要哪种输出?两行(3和4)或一行包含两个PostAmt值的总和?如果第1行=100;第2行=100,第3行=200?是否要隐藏所有三行?是,所有三行都将隐藏。我所要做的就是消除任何和为0的值。在这种情况下,请提供帮助:第1行=100,第2行=-150,第3行=75,是要显示所有3行,还是只显示一行25(求和结果)?