SQL SUM计算

| 我编写了以下查询来计算总和。该查询还如何显示其汇总的每个单独的记录?
SELECT \'BEN\' + CardCode, SUM(PayAmount) 
FROM BENSALEM.dbo.PWZ3
INNER JOIN BENSALEM.dbo.OPWZ T5 ON T5.IdNumber = IdEntry
WHERE T5.PmntDate = \'4/1/2011\' 
AND T5.Canceled = \'N\' 
AND Checked = \'Y\'
GROUP BY CardCode
    
已邀请:
您想在SELECT语句中使用WITH ROLLUP子句。根据您使用的SQL Server类型,有几种不同的语法。 MS SQL Server 2000/2005看起来像这样: SELECT \'BEN \'+ CardCode,SUM(PayAmount) 从BENSALEM.dbo.PWZ3 内部联接BENSALEM.dbo.OPWZ T5在T5.IdNumber = IdEntry T5.PmntDate = \'2011/4/1 \'和T5.Canceled = \'N \'AND Checked = \'Y \' 按卡代码分组并汇总 这将返回各个记录,以及附加记录,其中第一个字段为NULL,第二个字段为SUM()。请注意,您可以使用更多级别的分组来执行此操作,并且它将包括小计以及适当的字段设置为NULL。 SQL Server 2008具有更符合ANSI的语法,可以执行相同的操作: SELECT \'BEN \'+ CardCode,SUM(PayAmount) 从BENSALEM.dbo.PWZ3 内部联接BENSALEM.dbo.OPWZ T5在T5.IdNumber = IdEntry T5.PmntDate = \'2011/4/1 \'和T5.Canceled = \'N \'AND Checked = \'Y \' GROUP BY ROLLUP(CardCode) 据我所知,MySQL使用第一种形式,Oracle使用第二种形式。 编辑: 我的查询实际上并没有给出您想要的结果; ROLLUP()通过采用现有的聚合函数并在越来越多的组上递归执行该函数来工作。您想要的是拥有一系列没有聚合功能的行,然后一次应用聚合。 您可以使用COMPUTE BY子句来获得这种效果,但是很早以前就已弃用这些子句,并且结果很混乱,因此我避免使用它们。 (如果您确实愿意,请查看MSDN以获取详细信息。) 实现目标的最简单方法是找到一种使每个记录唯一的方法,例如包括一个主键字段,以便PayAmount和SUM(PayAmount)产生相同的结果,然后进行汇总。 SELECT IdEntry,\'BEN \'+ CardCode,SUM(PayAmount) 从BENSALEM.dbo.PWZ3 内部联接BENSALEM.dbo.OPWZ T5在T5.IdNumber = IdEntry T5.PmntDate = \'2011/4/1 \'和T5.Canceled = \'N \'AND Checked = \'Y \' GROUP BY ROLLUP(CardCode,IdEntry) 这将为您提供如下结果: 1 BEN1234 1000 2 BEN1234 2000 3 BEN1234 1000 空BEN1234 4000 4 BEN4567 1500 5 BEN4567 1500 6 BEN4567 1000 空BEN4567 4000 空8000 让我们知道这是否适合您。     
您不能在同一查询中进行汇总,也可以不进行汇总,但是可以将两者结合使用:
SELECT \'BEN\' + CardCode, SUM(PayAmount) 
FROM BENSALEM.dbo.PWZ3
INNER JOIN BENSALEM.dbo.OPWZ T5 ON T5.IdNumber = IdEntry
WHERE T5.PmntDate = \'4/1/2011\' 
AND T5.Canceled = \'N\' 
AND Checked = \'Y\'
GROUP BY CardCode

UNION ALL  -- combine the two
SELECT \'BEN\' + CardCode, PayAmount  -- not aggregating here, this will return all rows
FROM BENSALEM.dbo.PWZ3
INNER JOIN BENSALEM.dbo.OPWZ T5 ON T5.IdNumber = IdEntry
WHERE T5.PmntDate = \'4/1/2011\' 
AND T5.Canceled = \'N\' 
AND Checked = \'Y\'
编辑:由于您在注释中指定了MS SQL Server,因此Martin指出您可以在一个查询中使用
ROLLUP
进行操作。在此处阅读
ROLLUP
上的MSDN文档     
SELECT \'BEN\' + CardCode, BENSALEM.dbo.PWZ3.*,
       SUM(PayAmount) OVER (PARTITION BY CardCode) sum_PayAmount
  FROM BENSALEM.dbo.PWZ3
 INNER JOIN BENSALEM.dbo.OPWZ T5 ON T5.IdNumber = IdEntry
 WHERE T5.PmntDate = \'4/1/2011\' 
   AND T5.Canceled = \'N\' 
   AND Checked = \'Y\'
    
您将不得不使用第二个查询来检索所需的数据。当您使用“ 5”时,只会为group by列中的每个唯一值检索一行。通常,您添加到选择列表的任何字段都将返回组中第一行的值。 显然,诸如“ 6”之类的聚合函数返回该组中所有值的函数结果。     

要回复问题请先登录注册