2013-05-10 53 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