在一系列滚动日期中对MySQL视图进行分组

时间:2015-05-13 19:24:23

标签: mysql sql-view

我有两张桌子:

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.GroupIdGroupDateRange.GroupId

1 个答案:

答案 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