我有两张桌子:
Table Transmission
------------------------------
Id GroupID Amount Timestamp
1 1 5 2015-05-20 00:00:00
2 1 4 2015-05-19 00:00:00
3 1 10 2015-04-20 00:00:00
4 1 7 2015-04-19 00:00:00
5 1 9 2015-03-20 00:00:00
6 1 2 2015-03-18 00:00:00
Table Group
---------
Id DateCreated BillStart BillStop
1 2015-03-15 2015-05-15 2015-06-14
BillStart和BillStop每天都会触发它们,如果当前日期大于BillStop,BillStart / BillStop都会增加一个月(所以这些实际上是我们正在考虑的当前范围)。
我已经有了一个SQL视图,可以总结一系列传输条目,其中时间戳在BillStart和BillStop之间,我期待的是有另一个视图可以有效地保存过去几个月的传输总和。即如果BillStart / BillStop从2015-05-15到2015-06-14,那么该视图将知道将2015-4-15至2015-15-15范围内的过去传输分组到2015-4-14,依此类推,直到包含组创建日期的最后一个范围。
理想情况下,视图看起来像
-------------------------------------
GroupId Sum BillStart BillStop
1 9 2015-05-15 2015-06-14
1 17 2015-04-15 2015-05-14
1 11 2015-03-15 2015-04-14
有更好的方法吗?
我正在考虑的另一个选项是GroupBillRanges的表格,其中包含:
GroupBillRange
--------------
Id GroupId BillStart BillStop
1 1 2015-03-15 2015-04-14
2 1 2015-04-15 2015-05-14
3 1 2015-05-15 2015-06-14
当每个帐单范围按月更新时,这将被添加。有了这个,我就可以匹配所有Transmission.GroupId
到GroupDateRange.GroupId
答案 0 :(得分:0)
是的,您需要创建“GroupBillRange”表。否则,您将丢失任何关于旧组的账单开始/停止日期的记录。 (当然,你可以假设他们总是从15日到14日。但有一次他们不是,你会有问题。)一旦你这样做,像下面的查询应该给你你正在看的东西因为,我相信。 (哦,你有这个问题被标记为SQL Server和MySQL。所以我在SQL Server 2008 r2上创建了这个脚本。)
SET NOCOUNT ON;
DECLARE @Transmission TABLE (
ID int,
GroupID int,
Amount int,
TransmissionDate SmallDateTime );
INSERT @Transmission VALUES (1, 1, 5,'2015/05/20');
INSERT @Transmission VALUES (2, 1, 4,'2015/05/19');
INSERT @Transmission VALUES (3, 1,10,'2015/04/20');
INSERT @Transmission VALUES (4, 1, 7,'2015/04/19');
INSERT @Transmission VALUES (5, 1, 9,'2015/03/20');
INSERT @Transmission VALUES (6, 1, 2,'2015/03/18');
DECLARE @TableGroupRange TABLE (
ID int,
GroupID int,
BillStart SmallDateTime,
BillStop SmallDateTime );
INSERT @TableGroupRange VALUES (1, 1, '2015/03/15', '2015/04/14' )
INSERT @TableGroupRange VALUES (2, 1, '2015/04/15', '2015/05/14' )
INSERT @TableGroupRange VALUES (3, 1, '2015/05/15', '2015/06/14' )
SET NOCOUNT OFF;
SELECT TG.GroupID, SUM(T.Amount) as SumAmount, TG.BillStart, TG.BillStop
FROM @TableGroupRange TG
LEFT JOIN @Transmission T ON T.GroupID = TG.GroupID AND T.TransmissionDate BETWEEN TG.BillStart AND TG.BillStop
GROUP BY TG.GroupID, TG.BillStart, TG.BillStop
ORDER BY TG.GroupID, TG.BillStart, TG.BillStop