如何编写Join Query?

时间:2012-04-17 10:04:35

标签: ms-access

我无法加入我需要做的事情 - 这是问题所在: 我有一个由17名销售人员组成的数据库,每个销售人员都有自己的总计,如费用和预付款以及佣金。 在我的数据库中,大约有200个客户,最多可以有3个销售人员。这是少数,但确实存在。每个销售人员都按该帐户的发票付款。我的一些销售人员只是一个帐户的第二个销售人员,这意味着他们从来不是第一个,所以如果我将销售人员加入发票 - 他没有任何发票,因为他从不是推销员1。 当我只看发票时,我可以为他作为推销员2开发票,但每8周我需要加入他的费用,在那里他是推销员1他的发票,他是推销员2.我不能让它工作或上来有了解决方案。 我有一个销售人员查询,所以每8周我就可以拨打100号销售员来查看他的费用 我有一个发票/付款查询,看看他有什么付款 - 但我的第三个问题是,我试图将销售人员与他的付款一起工作,因为他是第一个支出的销售员和发票/付款的第二个推销员 我已经尝试过SQL中的每一种方式,似乎无法正确使用它。

有没有办法可以将salesman1从salesman查询加到slmn1或slmn2或slmn3上的发票/付款查询?

这个例子太复杂了:

FROM qryFinalWeek
INNER JOIN QryFW ON qryFinalWeek.SLMN = QryFW.SLMN2 OR QryFW.SLMN3 OR QryFW.Salesrep1
WHERE (((QryFW.PDATE)=[FDATE]+4));

这个例子只给出了他第一个推销员的发票,所以如果他是第二个,我就不能得到任何佣金:

WHERE (((qryFinalWeek.SLMN)=[Forms]![frFWDATE]![Text0]) AND ((QryFW.PDATE)=[FDATE]+4)) OR (((QryFW.SLMN2)=[Forms]![frFWDATE]![Text0]) AND ((QryFW.PDATE)=[FDATE]+4)) OR (((QryFW.SLMN3)=[Forms]![frFWDATE]![Text0]) AND ((QryFW.PDATE)=[FDATE]+4))

感谢任何反馈!

1 个答案:

答案 0 :(得分:2)

数据结构为您创造了问题。我的建议是从您的Customers表中删除销售人员(假设每个客户的数据多于关联的销售人员),并将它们添加到名为Salesmen_Customers的新表或类似的表中。该表将包含销售人员和客户之间的多对多关系

这是您当前的结构

old data structure

这是新结构

new data structure

这应该显着简化查询结构。如果您的销售人员超过3深,这也很容易扩展。如果您有兴趣进一步阅读有关数据库设计的主题,我建议SQL anti patterns。如果你真的嫁给了你的DB结构,你可以查询你的出路,但我不推荐它。