我的数据库中有一张表可以跟踪我们所有的团队,他们的名字,他们的领导以及他们在层次上从属于哪个团队(和经理)。每天/团队组合将有一排。
DAY | TEAM | MANAGER | PARENT_TEAM | PARENT_MANAGER
01/01/2017 | TeamRed | John | GroupWendy | Wendy
...
05/01/2017 | TeamRed | John | GroupKarl | Karl
...
10/05/2017 | TeamRed | John | GroupWendy | Wendy
现在,我的任务是将此数据分组以创建“历史”报告。像这样:
TEAM | MANAGER | PARENT_TEAM | PARENT_MANAGER | VALID_FROM | VALID_TO
TeamRed | John | GroupWendy | Wendy | 01/01/2017 | 04/01/2017
TeamRed | John | GroupKarl | Karl | 05/01/2017 | 10/05/2017
TeamRed | John | GroupWendy | Wendy | 11/05/2017 | 31/12/2099
通常我会按字符串字段分组并将日期设置为min和max。我无法克服的问题是团队可以从父团队中“来回”,我希望这个例子可以反映出来。
使用
SELECT team, manager, parent_team, parent_manager, MIN(day) AS valid_from, MAX(day) AS valid_to
FROM tblMock
GROUP BY team, manager, parent_team, parent_manager;
不会产生上面的结果(所需),而是
TEAM | MANAGER | PARENT_TEAM | PARENT_MANAGER | VALID_FROM | VALID_TO
TeamRed | John | GroupWendy | Wendy | 01/01/2017 | 31/12/2099
TeamRed | John | GroupKarl | Karl | 05/01/2017 | 10/05/2017
感谢任何人可能提供的帮助和最终的免责声明,希望以前没有问过,但我执行的搜索并没有真正帮助。 干杯, 伊戈尔
答案 0 :(得分:1)
尝试以下查询(不幸的是,这是一些复杂的SQL):
SELECT t.Team, t.Manager, t.parent_team,
(
SELECT Min(s.Day) FROM s WHERE s.Day > t.MaxPreviousTeam OR t.MaxPreviousTeam Is Null
) As VALID_FROM, t.VALID_TO
FROM (
SELECT f.Team, f.Manager, f.parent_team, Max(f.Day) As VALID_TO,
(
SELECT Max(Day) FROM tblMock fs WHERE fs.Team <> t.Team AND Day < VALID_TO
) As MaxPreviousTeam
FROM tblMock f
GROUP BY f.team, f.manager, f.parent_team, f.parent_manager
) AS t
我可以在需要时解释一些步骤。基本上,我首先选择除VALID_FROM
之外所需的所有列,而是计算低于团队不同的VALID_TO
的最高值。然后,我抓住所有这些值,并且最低值高于我刚刚计算的值。
答案 1 :(得分:0)
我尝试做某事,但我所做的并不是一个简单的查询。 我现在没有MSACCESS,但是我在MSSQL上尝试过它,试图只使用MSACCESS中可用的命令和功能。 可以简化它的可能性查询。您可以使用VBA函数执行更简单的操作(我尝试仅使用SQL)。
请告诉我。
)
);
示例数据(我在您的网站上添加了一些行):
INSERT INTO
<强>输出:强>
(