目前我有两个表,使用Access 2007
TimeSheet(empID,TimeSheet,hours) 和 率(EMPID,速率,PromotionDate)
如何根据促销日期选择正确的员工结算率? 例如,我有
Rates(001,10,#01/01/2013#)
Rates(001,15,#01/05/2013#)
Rates(002,10,#01/01/2013#)
和
Timesheet(001,#02/01/2013#,5)
Timesheet(001,#02/05/2013#,5)
Timesheet(002,#02/01/2013#,7)
在这种情况下,我想表明,如果empID 001在2013年1月2日提交时间表,那么它将以10美元/小时收费 ,但他从5月1日开始的时间表将以15美元/小时计费
我现在的查询是
SELECT t.empID , t.timesheet, r.hours ,
(SELECT rate FROM rate WHERE t.timeSheet >= r.promotionDate) AS RateBilled
FROM rate AS r , timesheet AS t
WHERE r.empid = t.empid
运行时,会显示一条消息“此子查询最多可返回一条记录”
任何帮助将不胜感激,谢谢。
编辑:
我使用sql有一些奇怪的输出
SELECT t.empID, t.timesheet, r.rate AS RateBilled
FROM Rates AS r, timesheet AS t
WHERE r.empid=t.empid And t.timeSheet>=r.promotionDate
GROUP BY t.empID, t.timesheet, r.rate, r.promotionDate
HAVING r.promotionDate=MAX(r.promotionDate);
你可以看到empID 1的输出表费率是从10到15之间来回切换,即使在5月1日之后,它应该全部使用15,
任何帮助表示赞赏,谢谢。
答案 0 :(得分:1)
您设置的select子查询可能会返回多个值,其中只应返回一个值。考虑可能有两个促销和最近的时间表的情况,然后选择将返回两个值,因为在两种情况下时间表都比促销更新。
尝试使用以下作为子查询:
SELECT TOP 1 rate FROM rate
WHERE t.timeSheet >= r.promotionDate
ORDER BY r.promotionDate DESC
N.B。我不认为上述内容非常有效。而是尝试像
这样的东西SELECT t.empID , t.timesheet, r.hours , r.rate AS RateBilled
FROM rate AS r , timesheet AS t
WHERE r.empid = t.empid AND t.timeSheet >= r.promotionDate
GROUP BY t.empID, t.timesheet
HAVING r.promotionDate = MAX( r.promotionDate);