2013-05-10 55 views
3

我试图为每个Acct获取SUM(Values),但我的问题是试图获得至少一个DISTINCT帐户的整个行与SUM(Values)在SQL Server 2008中使用distinct和sum

我有一些样本数据,例如:

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 

感谢。

+0

'acct = 666666666'有两个地址,你要哪一个? – Taryn 2013-05-10 20:01:18

+0

我想每个acct的第一行。 – dolm77 2013-05-10 20:05:07

+5

但是,识别第一行的内容是否有ID列或日期时间?表格中的数据不是固有的排序,你必须提供你想要的数据返回的顺序。 – Taryn 2013-05-10 20:05:51

回答

4

如果不要紧地址你回来,你就可以申请和汇总到其他列:

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

+1

@ dolm77你真的不在乎你得到哪条记录? – Zane 2013-05-10 20:24:39

+1

此外,如果这个答案是“完美”,你可能要考虑UpVoting /接受它。 – Zane 2013-05-10 20:38:18

+0

只要该记录与该特定帐号相关联即可。所以如果账户有多行地址,那就给我一个这样的地址。 – dolm77 2013-05-10 20:58:15

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; 
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中,我们要说的是按照(或者在OVER子句中调用PARTITION BY)分组的值来分组值。 FIRST_VALUE允许使用返回街道地址的第一个值。同样没有DATETIME列,所以很难说第一个值的顺序应该是什么。还有一个LAST_VALUE窗口函数。假设你有一个DATETIME列,你可能需要按该列值进行ORDER BY,如果没有,你可以选择一些像Street一样的值(MAX也可能是一个很好的选择,但是有一些DATETIME值是做到这一点的最佳方式)。

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

这里是BOL约SUM使用OVER子句: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