我试图排除净为零的交易,同时保留不净为零的交易及其唯一标识符。
我有一个看起来像这样的表:
create table dbo.some_GL_table
(
GLIndex uniqueidentifier not null ,
InvoiceNum string not null ,
PayeeNum string not null ,
TranAmount decimal not null ,
)
我当前的代码如下:
SELECT
MAX(GL.GLIndex) AS GLIndex
, GL.InvoiceNum
, GL.PayeeNum
, SUM(GL.TranAmount) AS TranNet
FROM dbo.some_GL_table AS GL
GROUP BY
GL.InvoiceNum
, GL.PayeeNum
HAVING SUM(GL.TranAmount) <> 0
每笔交易都有一个唯一的GLIndex,因此将GLIndex添加到GROUP BY中将不再折叠和取消(通过GROUP BY&HAVING)具有相同InvoiceNum&PayeeNum且净值为零的交易。
建议另一个线程上有人使用MAX(),这样GLIndex不必进入GROUP BY。这实际上弄乱了输出,因为当InvoiceNum和PayeeNum相同但未净为零时,它确实选择了MAX GLIndex。
这里有一张图片,可以帮助您直观地了解发生了什么。黄色高亮显示的InvoiceNum和PayeeNum相同,而TranNet网络的SUM等于零。这些应从结果中排除。但是,未突出显示的行具有相同的InvoiceNum和PayeeNum,但不会净为零。它们应包括在结果中。问题在于,TranNet将被求和,并且两个事务将折叠为一行,并且仅将选择MAX GLIndex并将其分配给该行。有没有一种方法可以将这两个未突出显示的事务与各自的GLIndexes保持为单独的行?我需要GLIndexes才能在查询中稍后加入。
答案 0 :(得分:0)
我认为您只想要not exists
:
select t.*
from some_GL_table t
where not exists (select 1
from some_GL_table t2
where t2.payeenum = t.payeenum and
t2.trannet = - t.trannet
);
答案 1 :(得分:0)
这里是使用CTE的示例。您用总和的金额创建了一个cte / subquery,然后加入其中并删除总计为0的值:
;WITH cte AS (
SELECT
InvoiceNum,
PayeeNum,
SUM(TranAmount) AS TranAmount
FROM some_GL_table
GROUP BY
InvoiceNum,
PayeeNum
)
select t.*
from some_GL_table t
INNER JOIN cte t2
ON t.InvoiceNum = t2.InvoiceNum
AND t.PayeeNum = t2.PayeeNum
AND t2.TranAmount <> 0
答案 2 :(得分:0)
这是另一种方法
if __name__ == "__main__":
答案 3 :(得分:0)
0 bytes + debug-overhead