这是我的表格的屏幕截图
我正在尝试删除按 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 。只剩下一份合同记录。
更新
更多说明:
我想要做的是首先将第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
感谢。
答案 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)。