按MS Access

时间:2017-09-07 08:01:35

标签: sql ms-access

我的数据库中有一张表可以跟踪我们所有的团队,他们的名字,他们的领导以及他们在层次上从属于哪个团队(和经理)。每天/团队组合将有一排。

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

感谢任何人可能提供的帮助和最终的免责声明,希望以前没有问过,但我执行的搜索并没有真正帮助。 干杯, 伊戈尔

2 个答案:

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

<强>输出:

(