4

我正在尝试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

谢谢。

4

3 回答 3

4

如果返回的地址无关紧要,则可以应用并聚合到其他列:

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

请参阅带有演示的 SQL Fiddle

于 2013-05-10T20:03:34.140 回答
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;
于 2013-05-10T20:03:40.197 回答
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
;

Windowing Functions 的好处是,您无需在函数中添加不需要的内容(例如 SUM),而是可以专注于描述您要查找的内容。

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

看看这个 SQL Fiddle: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

于 2013-05-10T21:12:20.123 回答