我需要一些关于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
答案 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子句中退出BillDate
和Bill
,您将获得正确的结果。
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功能来说仍然是有用的知识,如果您在使用它时遇到问题,则值得一读。