MS Access产品经理容量时间表查询/报告

时间:2016-09-19 15:04:16

标签: sql database ms-access timeline

这可能需要一些解释,但我试图弄清楚这是否是一个查询我还没有弄清楚如何写,或者如果这可以通过改变更好地解决我已建立的MS Access数据库的当前结构。所以说... ...

我有一个MS Access数据库,其中有3个主要表来解决此问题:

[Products]
[ProductChanges]
[Managers]

它们是这样链接的:

[Products].[ID] -> [ProductChanges].[PName]
[Products].[CurrManager] -> [Managers].[ID]
[ProductChanges].[CurrManager] -> [Managers].[ID]

Products表列出了我们服务(或将服务)的所有当前,过去和未来产品,ProductChanges表包含该产品的所有更改(经理之间的移动,状态更新等)我已经获得从导航视图看起来非常好看,每个产品的表单显示其当前状态,管理器,子表单显示其过去和即将发生的更改(来自ProductChanges表)。

我还编写了一个更新查询,该查询在每次打开数据库时运行,根据ProductChanges表中的更改日期更新Products表中的CurrManager字段,并将其更新为ProductChanges表中的CurrManager字段。也许我应该更改其中一个字段名称,现在输入它会让人感到困惑。

这是一个棘手的部分:随着新产品的出现,我们需要知道哪些经理可以承担更多(他们拥有最大产能)。目前的容量很容易,查询产品表的字段' CurrManager'现在计算分配给他们的产品的ID,但我们需要确定将来谁有能力,最好是时间轴格式。由于产品易手(有些完成并转移到其他地方),每个经理监督的产品数量将随着数据库根据ProductChanges表中的日期自行更新而改变。

理想情况下,最终输出的示例如下:

          1/1/2016 | 1/8/2016 | 1/15/2016
Smith, J  10         12         9

取决于计划分配给J. Smith的产品数量,或者在这些日期之间从J. Smith转移。 A"按周容量"实质上。我已经取得了一些进展,但已经挂了一段时间。这个查询将为我提供历史的基本时间表,但我似乎无法总结日期范围的投资组合:

SELECT Managers.LastName
    ,Managers.FirstName
    ,ProductChanges.Effectivedate
    ,[ProductChanges].[EffectiveDate] - Weekday([ProductChanges].[EffectiveDate]) + 1 AS [Week Of]
    ,Count(Products.Name) AS NumProducts
FROM Managers
RIGHT JOIN (
    Products INNER JOIN (
        ProductChanges LEFT JOIN Managers AS Managers_1 ON ProductChanges.CurrManager = Managers_1.ID
        ) ON Products.ID = ProductChanges.InnCode
    ) ON Managers.ID = Products.CurrManager
    ,Managers.FirstName
    ,ProductChanges.Effectivedate
    ,[ProductChanges].[EffectiveDate] - Weekday([ProductChanges].[EffectiveDate]) + 1
HAVING (
        ((Managers.LastName) IS NOT NULL)
        AND ((ProductChanges.Effectivedate) > 0)
        )
ORDER BY Managers.LastName;

这是一团糟,我知道,所以如果需要(以及何时)澄清,我会非常仔细地观察这一点。

3 个答案:

答案 0 :(得分:0)

考虑crosstab query(在其他RDMS中不可用的唯一MS Access SQL查询),它沿着运行任何聚合的值列(即生效日期)来转动数据(Count,Sum,Avg,Min,Max,等等。)。

以下在聚合查询中加入所有三个 Managers ProductChanges Products 表。根据您的架构根据需要进行调整。在MSAccess.exe中,您可以在设计视图中调整交叉表,选择行标题(一个或多个),列标题(仅一个)和(只有一个)字段:

TRANSFORM Count(p.InnCode) AS NumProducts
SELECT m.LastName, m.FirstName
FROM (Managers m
INNER JOIN ProductChanges pc
    ON m.[ID] = pc.[CurrManager])
INNER JOIN Products p
    ON pc.[PName] = p.[ID]
GROUP BY m.LastName, m.FirstName
PIVOT pc.Effectivedate

请注意:MS Access表/查询的限制为255列。因此,如果您遇到超过254个唯一日期,则需要过滤可以使用PIVOT Column IN()子句处理的日期。考虑甚至通过VBA参数动态地在接下来的3-4周内传递当前的电流。

TRANSFORM Count(p.InnCode) AS NumProducts
SELECT m.LastName, m.FirstName
FROM (Managers m
INNER JOIN ProductChanges pc
    ON m.[ID] = pc.[CurrManager])
INNER JOIN Products p
    ON pc.[PName] = p.[ID]
GROUP BY m.LastName, m.FirstName
PIVOT pc.Effectivedate IN ('1/1/2016', '1/8/2016', '1/15/2016')

答案 1 :(得分:0)

最简单的方法是查询您的表并添加一个将日期转换为"周的字段。类似于你用

做的
ProductChanges.EffectiveDate - Weekday(ProductChanges.EffectiveDate) + 1

从那时起,它只是一个简单的查询分组 - 在你将所有其他表格加入到你的ProductChanges表之后。

答案 2 :(得分:0)

我得到了它!它最终只是一个步骤来获得我需要它做的事情,但只要记录是产品变更的最新记录,这就向我显示了经理获得和失去产品的实际时间表。

我必须这样做的主要原因是,如果缺少某些内容,用户可以更改产品的过去历史记录,这意味着记录ID在相对于EffectiveDate字段,ProductChanges表可以被认为是基本上随机的,只对ProductChanges表进行运行总查询,但对于产品更改历史记录已更改的管理员来说,这几乎不起作用。我写了一个快速脚本来构建一个专门用于按照我需要的方式订购ID的表:

compile 'org.springframework.cloud:spring-cloud-starter-hystrix'

对于经理获得的每个产品,这也给了我一个加号,对于他们传递的每个产品,它给我一个减1。通过此查询抛出:

Dim db As Database Set db = CurrentDB db.Execute "DROP TABLE GainLoss;" db.Execute "CREATE TABLE GainLoss(AutoID AutoIncrement, HCID Long, MgrID Long, LastName varchar(100), FirstName varchar(100), HCDate Date, GainLoss Long)" db.Execute "INSERT INTO GainLoss(HCID, MgrID, LastName, FirstName, HCDate, GainLoss) SELECT hc.ID, s.ID, s.LastName, s.FirstName, hc.EffectiveDate, iif(s.id = hc.currmanager,1,-1) FROM Managers s INNER JOIN ProductChanges hc ON (s.ID = hc.currmanager OR s.ID = hc.prevmanager) ORDER BY LastName, FirstName, EffectiveDate;"

您已经有了一个时间表,显示每个更改都会向经理的投资组合添加或减少产品。