我有两个看起来像这样的表:
Categories ( CategoryId, Type, Name )
Transactions ( TxnId, DateTime, Amount, CategoryId )
我想获得每个月每个类别SUM
的所有交易。
我可以通过有一个 sproc(见下文)来做到这一点,它为给定日期范围(例如一个月)的每个类别生成总和2013-07-01 <= Transactions.DateTime < 2013-08-01
。但是我不知道如何为数据库中的所有月份执行此操作,所以我决定我可以重复运行存储过程(给定不同的最小/最大日期)以获得不同月份的总和。
我想将结果合并到一个表中。
我的类别 sum sproc 如下所示:
SELECT
Categories.Name,
Categories.Type,
Categories.CategoryId,
CategorySpendingForMonth.Amount
FROM
Categories
LEFT OUTER JOIN (
SELECT
CategoryId,
SUM(Amount) AS Amount
FROM
Txns
WHERE
[DateTime] >= @fromDate
AND
[DateTime] < @toDate
GROUP BY
CategoryId
) AS CategorySpendingForMonth ON Categories.CategoryId = CategorySpendingForMonth.CategoryId
ORDER BY
Categories.Type,
Categories.Name
我的结果如下所示:
Name Type CatId Amount
Car 0 9 -183.22
Electricity 0 12 -86.05
Insurance 0 17 NULL
Internet 0 14 -39.99
Phone 0 23 -50.04
Rent 0 19 -2284.80
Xoom 0 25 -604.99
但我希望它看起来像这样:
Name Type CatId June July Aug
Car 0 9 -183.22 -183.22 -183.22
Electricity 0 12 -86.05 -86.05 -86.05
Insurance 0 17 NULL -12.30 NULL
Internet 0 14 -39.99 -39.99 -39.99
Phone 0 23 -50.04 -50.04 -50.04
Rent 0 19 -2284.80 -2284.80 -2284.80
Xoom 0 25 -604.99 -604.99 -604.99
(并为额外的月份添加额外的列)
所以我在想我可以简单地为我想要添加数据的每个月调用我的 sproc,但我不知道如何像那样将我现有的数据连接在一起(如果它是垂直的,我会使用 UNION,但是这个是水平的)。
这就是我的想法(无效的 SQL):
SELECT
Name,
Type,
CategoryId,
Amount
FROM
EXEC CategoriesSummary( '2013-07-01', '2013-08-01' )
FOR i = 0 TO 12
LEFT OUTER JOIN CategoriesSummary( '2013-' + (7 + i) +'-01', '2013-' + (8 + 1) + '-01' )
NEXT
....但这是无效的,那么解决这个问题的最佳方法是什么?
谢谢!