如何在此表上使用group by

时间:2013-02-26 12:55:19

标签: sql-server-2008

这是我的表格的屏幕截图

enter image description here

我正在尝试删除按 sales_contract_nbr 名称分组的 PostAmt 之和为0的所有行。< / p>

例如:

sales_contract_nbr 51101008103将按名称分组时删除,sales_contract_nbr为-96.83时将被删除,当总计为0时将为96.83。

非常简单吧?

但我想要除此之外的是我想删除组中的合同。我的意思是,如果合同 51101008195 被分组,则其数量为 533.87 ,不会被删除(突出显示)

但我想将其删除

例如,

两行合约编号 51101008195 应首先汇总(见下图)我的意思是 -533.87 533.87 应该相加得到总数 0 。只剩下一份合同记录。

enter image description here

更新

更多说明:

enter image description here

我想要做的是首先将第1和第2行分组(匹配数量为正数,其他为负数),然后将其他数据分组。如果有4行相同的合同编号,那么第1行和第2行应该已经分组,那么如果绝对数量相同则应该对第3行和第4行进行分组,如果不是第3行和第4行没有被删除。

enter image description here

我想使用group by来消除总结尾为0且名称或合同号相同的行。

我希望我已经明确了这个问题。如果没有,请问。

怎么做?

到目前为止我所做的是:

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

感谢。

1 个答案:

答案 0 :(得分:1)

以下是我现在提出的问题:

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

请参阅SQLFiddle

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

此外,如果某些行具有相同的数量,它们将被分组。这就是为什么我添加了一列计算那些行相等的列,以及一列将它们加在一起。

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

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