基于当前表的总和的匹配字段的MSAccess / SQL查找表。字段

时间:2015-05-09 05:17:51

标签: sql-server ms-access adodb

上周,我一直在努力解决这个问题。我想在表中返回唯一的名字,包括他们的积分和他们当前的舞蹈等级。最终,我希望将返回的舞蹈级别与存储在客户表格中的内容与客户进行比较,并仅显示两个舞蹈级别不同的记录(存储的舞蹈级别和基于当前点数的计算的舞蹈级别。

最终解决方案将是使用ADODB连接到MSAccess DB(2013)的网页。但对于初学者来说,只是希望它能在MSAccess中运行。

我有一个带有下表的MSAccess DB(2013)。

PointsAllocation
CustomerID  Points
100            2
101            1
102            1
100            1
101            4

DanceLevel
DLevel           Threshold
Beginner            2
Intermediate        4
Advanced            6

Customer
CID   Firstname Dancelevel1
100   Bob      Beginner
101   Mary     Beginner
102   Jacqui   Beginner

我想通过在第一个表中使用其Points的SUM来找到每个客户的当前DLevel。我先这个......

SELECT SUM(Points), CustomerID  FROM PointsAllocation GROUP BY CustomerID

效果很好,并给出了每位客户的总积分。然后,我可以将其加入到客户表中以获取人员姓名。完美。

现在我想将DanceLevel表中的DLevel添加到SUM总计用于查找阈值且不超过该值的结果中,因此我得到以下结果:

(1)     (2)     (3)        (4)
Bob     3      Beginner   Intermediate
Mary    5      Beginner   Advanced

Where...
(1) Customer.Firstname
(2) SUM(PointsAllocation.Points)
(3) Customer.Dancelevel1
(4) Dancelevel.DLevel

Jacqui没有显示,因为她的点数总和小于或等于2,给她一个计算的初级舞蹈等级,这已经与她在客户表中的Dancelevel1相匹配。

任何想法?

1 个答案:

答案 0 :(得分:0)

您可以从客户表开始,因为您想列出每个客户。然后左边加入一个子查询,计算舞蹈等级和总分。最里面的子查询总计得分,然后加入有效的舞蹈等级,并从舞蹈等级中选择最大阈值。然后再次在DanceLevel表上连接阈值以获得关卡的描述。

Select Customer.Firstname,
  CustomerDanceLevels.Points,
  Customer.Dancelevel1,
  Dancelevel.DLevel
from Customer
left join
  (select CustomerID, Points, Min(Threshold) Threshold
  from
      (select CustomerID, sum(Points) Points
      from PointsAllocation
      group by CustomerID
      ) PointsTotal
    left join DanceLevel
    on PointsTotal.Points <= DanceLevel.Threshold
  group by CustomerID, Points
  ) CustomerDanceLevels
on Customer.CID = CustomerDanceLevels.CustomerID
left join DanceLevel
on CustomerDanceLevels.Threshold = DanceLevel.Threshold