0

这是我的桌子的屏幕截图

在此处输入图像描述

当按sales_contract_nbrname分组时,我试图删除所有PostAmt总和为 0 的行。

例如 :

sales_contract_nbr 51101008103在按名称分组时将被删除,而 sales_contract_nbr 为 -96.83 和 96.83 时总和为 0。

很简单吧?

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

但我想分组删除

例如,应首先将两行合同编号51101008195相加(见下图)我的意思是应将 -533.87533.87的金额相加以获得总和0。只应留下一份合同记录。

在此处输入图像描述

更新

更多说明:

在此处输入图像描述

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

在此处输入图像描述

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

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

怎么做到呢?

到目前为止我正在做的是:

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

谢谢。

4

1 回答 1

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)。

于 2013-02-26T12:58:57.987 回答