在sql server 2008中使用distinct和sum

时间:2013-05-10 19:57:59

标签: sql sql-server-2008

我正在尝试为每个帐户获取SUM(Values),但我的问题是尝试使用DISTINCT获取SUM(Values)帐户的至少一整行。

我有一些示例数据,例如:

Acct         Values    Name       Street     
123456789    100.20    John       66 Main Street
123456789    200.80    John       22 Main Avenue
222222222    50.25     Jane       1 Blvd
333333333    25.00     Joe        55 Test Ave
333333333    50.00     Joe        8 Douglas Road
555555555    75.00     Tim        12 Clark Ave
666666666    500.00    Tim        12 Clark Street
666666666    500.00    Tim        3 Main Rd.

我的查询包括:

SELECT DISTINCT Acct, SUM(Value) AS [TOTAL]
FROM TABLE_NAME
GROUP BY Acct

上面的查询让我接近我需要的东西,但我需要整行。

下面我正在寻找的例子:

Acct         Total      Name       Addr1     
123456789    301.00     John       66 Main Street 
222222222    50.25      Jane       1 Blvd
333333333    75.00      Joe        55 Test Ave
555555555    75.00      Tim        12 Clark Ave
666666666    1000.00    Tim        12 Clark Street

感谢。

3 个答案:

答案 0 :(得分:4)

如果您返回的地址无关紧要,那么您可以申请并汇总到其他列:

SELECT Acct, 
  SUM(Value) AS [TOTAL], 
  max(name) name, 
  max(Street) addr1
FROM TABLE_NAME
GROUP BY Acct;

请参阅SQL Fiddle with Demo

答案 1 :(得分:4)

您可以在大多数数据库中使用row_number()等窗口函数来执行此操作:

select acct, total, name, addr1
from (select t.*, row_number() over (partition by acct order by acct) as seqnum,
             sum(value) over (partition by acct) as Total
      from table_name
     ) t
where seqnum = 1;

答案 2 :(得分:3)

我会使用窗口函数(OVER子句)来解决这个问题。

SELECT DISTINCT 
   Acct
  ,SUM([Values]) OVER (PARTITION BY Acct) AS 'Total'
  ,Name
  ,FIRST_VALUE(Street) OVER (PARTITION BY Acct ORDER BY Street DESC) AS 'Addr1'
  FROM TABLE_NAME
;

窗口函数的优点在于,您不会将事物添加到函数中不需要的分组(例如SUM),而是可以专注于描述您要查找的内容。

在上面的SQL中,我们说我们希望按值分组的SUM(或者在OVER子句中调用PARTITION BY)Acct。 FIRST_VALUE允许用来返回街道地址的第一个值。同样没有DATETIME列,因此很难说第一个值的顺序是什么。还有一个LAST_VALUE窗口函数。假设你有一个DATETIME列你想要ORDER BY那个列值,如果不是你可以选择一些像我对Street一样的值(MAX也可能是一个很好的选择,但是有一些类型的DATETIME值将是最好的方法)。

查看此SQL小提琴:http://sqlfiddle.com/#!6/a474c/8

以下是使用OVER子句的关于SUM的BOL:http://msdn.microsoft.com/en-us/library/ms187810.aspx

以下是有关FIRST_VALUE的更多信息:http://blog.sqlauthority.com/2011/11/09/sql-server-introduction-to-first-_value-and-last_value-analytic-functions-introduced-in-sql-server-2012/

以下是关于窗口函数的博文:http://comp-phil.blogspot.com/2013/03/higher-order-functions.html