我有两张 table :
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 View ,可以汇总时间戳介于 BillStart 和 BillStop 之间的一系列传输条目,我想要做的是有另一个 View ,可以有效地保存过去几个月的传输总和。即,如果 BillStart/BillStop 从 2015-05-15 到 2015-06-14,则 View 将知道对 2015-4-15 到 20-15-14、2015-3-15 范围内的过去传输进行分组到 2015 年 4 月 14 日,依此类推,直到包含组创建日期的最后一个范围。
理想情况下, View 看起来像这样
-------------------------------------
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
最佳答案
是的,您需要创建“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
关于mysql - 按滚动日期序列对 MySQL View 进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30223577/