我正在尝试在SQL Server 2008中编写一个非常复杂的查询.我想在这里得到SQL专家的一些意见.
想象一下,我有一个包含这些字段的付款表:
PaymentID int,CustomerID int,PaymentDate datetime,Amount decimal
基本上,它是客户在特定日期支付的表格.需要注意的一点是,在某些情况下,付款金额可能是负值.因此,随着时间的推移,任何给定客户支付的总金额可能会上升或下降.
我们要弄清楚的是用于计算每个客户支付总金额的高点的SQL.
因此,如果弗雷德支付3笔款项:首先是5美元,第二是5美元,第三是3美元.该报告将显示弗雷德的最高支付总额为10美元(第二次支付),他的最终支付金额为7美元.
我们需要为十万客户(他们可能每人支付一百到一千美元)运行此报告,因此它必须快速.
是否有一种很好的方法来构建此查询而不将运行总计存储在数据库中?如果可能的话,我们希望避免存储预先计算的值.
你的问题似乎是这样的:
SELECT CustomerID, SUM(Ammount) FROM table WHERE Amount > 0 GROUP BY CustomerID
SELECT CustomerID, SUM(Ammount) FROM table GROUP BY CustomerID
Run Code Online (Sandbox Code Playgroud)
但是,我认为你的意思是你想要一个看起来像这样的表
Customer Payment HighPoint RunningTotal
123 5 5 5
123 5 10 10
123 -3 10 7
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我将使用上面的两个选择创建一个视图,以便视图类似.
SELECT CusotmerID,
PaymentDate,
Ammount,
(SELECT SUM(Ammount)
FROM table as ALIAS
WHERE ALIAS.Amount > 0
AND ALIAS.PaymentDate <= PaymentDate
AND ALIAS.CustomerID = CustomerID),
(SELECT SUM(Ammount)
FROM table as ALIAS
WHERE ALIAS.CustomerID = CustomerID
AND ALIAS.PaymentDate <= PaymentDate)
FROM table
Run Code Online (Sandbox Code Playgroud)
此外,您可以考虑在表的Amount列上使用非唯一索引来加速视图.
归档时间: |
|
查看次数: |
8058 次 |
最近记录: |