有没有一种方法可以使用T-SQL选择列而不是GROUP BY?

时间:2020-10-22 15:45:38

标签: sql sql-server tsql group-by

我试图排除净为零的交易,同时保留不净为零的交易及其唯一标识符。

我有一个看起来像这样的表:

   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才能在查询中稍后加入。

SampleGLData

4 个答案:

答案 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