我正在尝试针对我为一家矿业公司收集的一组数据进行报告。
每天,一个采矿项目都会从其矿山和工厂发送数据。数据由三组读数组成:读数,当天的计划以及每月目标是多少。每月目标保持一个月不变,但每日目标通常保持不变,但在特殊情况下可以更改。
所以我制作了一个铣削和采矿的读数表,并将3个实例合并到采矿/铣削报告中。
这是我的数据库的关系图:
现在,我想计算每次读数获得的百分比。因此,我需要获取生产读数,并将其除以等效的每日目标。
问题是,我对SQL和Access相当陌生
我仍然想尝试将3个读数表合并用于单个报表的挖掘/铣削。 我已经尝试过了:
SELECT Rapport_quotidien.ID_rapport,
Données_mine.*,
Données_mine_1.*,
Données_mine_2.*,
Données_moulin.*,
Données_moulin_1.*,
Données_moulin_2.*
FROM Données_mine AS Données_mine_1,
Données_mine AS Données_mine_2,
Données_moulin AS Données_moulin_1,
Données_moulin AS Données_moulin_2, (Données_moulin
INNER JOIN Rapport_moulin ON (Données_moulin.ID_data_moulin = Rapport_moulin.Cible_quotidienne)
AND (Données_moulin.ID_data_moulin = Rapport_moulin.Usinage)
AND (Données_moulin.ID_data_moulin = Rapport_moulin.Cible_mensuelle))
INNER JOIN ((Données_mine
INNER JOIN Rapport_minier
ON (Données_mine.ID_data_mine = Rapport_minier.Production)
AND (Données_mine.ID_data_mine = Rapport_minier.cible_quotidienne)
AND (Données_mine.ID_data_mine = Rapport_minier.cible_mensuelle))
INNER JOIN Rapport_quotidien ON Rapport_minier.ID_minier = Rapport_quotidien.Minier)
ON Rapport_moulin.ID_moulin = Rapport_quotidien.Moulin
WHERE (((Rapport_quotidien.ID_rapport)=[ID du rapport:]));
它为我提供了正确的字段,但是即使我有要测试的数据也没有数据。 这是设计模式下的样子:design
答案 0 :(得分:0)
您必须使用以下格式:
FROM ((MyTable MyTable1
INNER JOIN MyTable MyTable2 ON [links between MyTable1 and MyTable2])
INNER JOIN MyTable MyTable3 ON [links between MyTable1 or MyTable2 and MyTable3])
INNER JOIN OtherTable ON [links between MyTable1 or MyTable2 or MyTable3 and OtherTable]
或这个
FROM (((RootTable
INNER JOIN SubTable SubTable1 ON [links between RootTable and SubTable1])
INNER JOIN SubTable SubTable2 ON [links between RootTable and SubTable2])
INNER JOIN SubTable SubTable3 ON [links between RootTable and SubTable3])
INNER JOIN OtherTable ON [links between RootTable and OtherTable]
您可能需要OUTER
而不是INNER ones
的联接,在这种情况下,请务必考虑到丢失的记录
答案 1 :(得分:0)
考虑在查询构建中从父表开始向下。并且由于该查询使用许多表,因此请使用MS Access的GUI设计,其中应将表仔细排列并检查每一步的结果。由于您具有联接关系,因此添加表会自动设置INNER JOIN ON
子句。
如果检查结果之一产生零记录,那么您确定了导致该问题的表。我的猜测是,由于记录未完全对齐,您可能需要在所有链接上使用LEFT JOIN
而不是INNER JOIN
。同样,请在GUI设计器中逐步进行此操作。
另一种方法是构建子查询,矿和米尔查询(没有主 Report_Quotidien 表),然后将这些查询加入主数据库查询。还要注意使用表别名来减少长名称的长度:
SELECT mn.*, ml.*
FROM (Report_Quotidien r
LEFT JOIN MineQuery mn ON mn.ID_minier = r.Minier)
LEFT JOIN MillQuery ml ON ml.ID_moulin = r.Moulin
MineQuery (让UI设计人员设置链接字段,但将连接调整为LEFT)
SELECT mine.*, d.*. d1.*, d2.*
FROM ((Rapport_minier mine
LEFT JOIN Données_mine d ON d.ID_data_mine = mine.cible_quotidienne)
LEFT JOIN Données_mine_1 d1 ON d1.ID_data_mine = mine.cible_mensuelle)
LEFT JOIN Données_mine_2 d2 ON d2.ID_data_mine = min.Production
MillQuery (让UI设计人员设置链接字段,但将联接调整为LEFT)
SELECT mill.*, d.*. d1.*, d2.*
FROM ((Rapport_moulin mill
LEFT JOIN Données_moulin d ON d.ID_data_moulin = mill.cible_mensuelle)
LEFT JOIN Données_moulin_1 ON d1.ID_data_moulin = mill.Cible_quotidienne)
LEFT JOIN Données_moulin_2 ON d2.ID_data_moulin = mill.Usinage
答案 2 :(得分:0)
最后,我要做的就是在GUI中重新定义Join关系。我将Rapport_minier.cible_quotidienne链接到Données_mine_1,将Rapport_minier.cible_mensuelle链接到Données_mine_2,将Rapport_moulin.cible_quotidienne链接到Données_moulin_1,将Rapport_moulin.cible_mensuelle链接到Données_moulin_2。
这使查询变得如此混乱:
SELECT Rapport_quotidien.ID_rapport, Données_mine.*, Données_mine_1.*, Données_mine_2.*, Données_moulin.*, Données_moulin_1.*, Données_moulin_2.*
FROM Données_moulin AS Données_moulin_2
INNER JOIN (Données_moulin AS Données_moulin_1
INNER JOIN (Données_moulin
INNER JOIN (Rapport_moulin
INNER JOIN ((Données_mine AS Données_mine_2
INNER JOIN (Données_mine AS Données_mine_1
INNER JOIN (Données_mine
INNER JOIN Rapport_minier ON Données_mine.ID_data_mine = Rapport_minier.Production)
ON Données_mine_1.ID_data_mine = Rapport_minier.cible_quotidienne)
ON Données_mine_2.ID_data_mine = Rapport_minier.cible_mensuelle)
INNER JOIN Rapport_quotidien ON Rapport_minier.ID_minier = Rapport_quotidien.Minier)
ON Rapport_moulin.ID_moulin = Rapport_quotidien.Moulin)
ON Données_moulin.ID_data_moulin = Rapport_moulin.Usinage)
ON Données_moulin_1.ID_data_moulin = Rapport_moulin.Cible_quotidienne)
ON Données_moulin_2.ID_data_moulin = Rapport_moulin.Cible_mensuelle
WHERE (((Rapport_quotidien.ID_rapport)=[Rapport à chercher]));