我正在尝试为每个帐户获取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
感谢。
答案 0 :(得分:4)
如果您返回的地址无关紧要,那么您可以申请并汇总到其他列:
SELECT Acct,
SUM(Value) AS [TOTAL],
max(name) name,
max(Street) addr1
FROM TABLE_NAME
GROUP BY Acct;
答案 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