SQL Sum将多行合并为一行

时间:2014-01-20 20:32:38

标签: sql function group-by sum

我需要一些关于SUM功能的帮助。我试图将同一帐户的帐单金额合并为一个总计,但我得到的结果显示我的SUM列只是将我的第一列乘以3。

以下是我想要的模拟数据结果:

AccountNumber    Bill      BillDate   
1                100.00    1/1/2013     
1                150.00    2/1/2013   
1                200.00    3/1/2013 
2                75.00     1/1/2013  
2                100.00    2/1/2013   

查询:

SELECT AccountNumber, Bill, BillDate, SUM(Bill)
FROM Table1
GROUP BY AccountNumber, Bill, BillDate


AccountNumber    Bill      BillDate    SUM(Bill)
1                100.00    1/1/2013    450.00    
1                150.00    2/1/2013    450.00
1                200.00    3/1/2013    450.00
2                75.00     1/1/2013    175.00
2                100.00    2/1/2013    175.00

OR

AccountNumber    Bill      SUM(Bill)
1                100.00    450.00    
2                75.00     175.00

如果可能的话,我希望得到两个结果。

这是我得到的:

我的SUM列只是乘以3,它实际上并不是基于帐号来汇总数据。

AccountNumber    Bill      BillDate    SUM(Bill)
1                100.00    1/1/2013    300.00    
1                150.00    2/1/2013    450.00
1                200.00    3/1/2013    600.00
2                75.00     1/1/2013    225.00
2                100.00    2/1/2013    300.00

5 个答案:

答案 0 :(得分:10)

如果您不想对结果进行分组,请使用窗口功能。

您没有说明您的DBMS,但这是ANSI SQL:

SELECT AccountNumber, 
       Bill, 
       BillDate, 
       SUM(Bill) over (partition by accountNumber) as account_total
FROM Table1
order by AccountNumber, BillDate;

这是一个SQLFiddle:http://sqlfiddle.com/#!15/2c35e/1

您甚至可以通过添加:

来添加运行总和
sum(bill) over (partition by account_number order by bill_date) as sum_to_date

将为您提供当前行日期的总计。

答案 1 :(得分:7)

您正在使用BillDate进行分组,但每个帐户的帐单日期都不同,因此您的行不会被分组。如果你考虑一下,这甚至没有意义 - 它们是不同的账单,并且有不同的日期。同样适用于Bill - 您试图为账户汇总账单,为什么要按此分组呢?

如果您从select和group by子句中退出BillDateBill,您将获得正确的结果。

SELECT AccountNumber, SUM(Bill)
FROM Table1
GROUP BY AccountNumber

答案 2 :(得分:3)

您应该按照要应用SUM的字段进行分组,并且不要在SELECT中包含除多行值之外的任何字段,例如COUNT,SUM,AVE等,因为如果您在此情况下包含Bill字段,则仅将显示行集中的第一个值,几乎没有意义且令人困惑。

这将返回每个帐号的帐单总和:

SELECT SUM(Bill) FROM Table1 GROUP BY AccountNumber

您可以根据需要添加更多子句,如WHERE,ORDER BY等。

答案 3 :(得分:1)

  

我尝试了这个,但查询不会运行告诉我我的字段在select语句中无效,因为它不包含在聚合函数或GROUP BY子句中。这迫使我把它留在那里。有办法解决这个问题吗?

您需要进行自我加入。您不能在同一子查询中聚合和保留非聚合数据。 E.g。

select q2.AccountNumber, q2.Bill, q2.BillDate, q1.BillSum
from
(
SELECT AccountNumber, SUM(Bill) as BillSum
FROM Table1
GROUP BY AccountNumber
) q1,
(
select AccountNumber, Bill, BillDate
from table1
) q2
where q1.AccountNumber = q2.AccountNumber

答案 4 :(得分:0)

感谢您的回复。原来我的问题是数据库问题有重复的条目,而不是我的逻辑。快速表同步已修复,并且SUM功能按预期工作。这对于SUM功能来说仍然是有用的知识,如果您在使用它时遇到问题,则值得一读。