我需要一些帮助,让这个脚本按照我的意愿行事。
SELECT KM.initials,
TPL.debprice,
TMP.pricegroup,
TMP.date
FROM klientmedarbejder KM
INNER JOIN timeprismedarbejderprisgruppe TMP
ON KM.employeeno = TMP.employeeno
INNER JOIN timeprisprisgruppelinie TPL
ON TMP.pricegroup = TPL.pricegroup
GROUP BY KM.initials,
TMP.date,
TPL.debprice,
TMP.pricegroup,
TPL.date
HAVING ( Max(TMP.dato) = TPL.date )
我需要的是具有最新(最大)日期的debPrice。一名员工经历了他的职业生涯,偶尔他的价格会升级。价格从一组价格中选择。
KlientMedarbejder
是员工表。 TimeprisMedarbejderPrisgruppe
是他的记录升级到新价格的日期列表。 TimeprisPrisgruppeLinie
是您可以拥有的价格列表。 我的解决方案是每位员工最多2个选项。因此:
emp A - 300 - 9 - 1900-01-01
emp A - 500 - 4 - 2012-01-01
emp B - 400 - 6 - 1900-01-01
emp B - 800 - 8 - 2012-04-01
因此,第一条记录是他加入公司时的默认记录。 2012年,他终于有了足够好的价格。现在,我需要在每个员工的升级列表上找到最新日期的答案。因此,emp A应该给我500,而emp B应该给我800.现在并非所有员工都可以更新01-01或04-01。有些员工随着时间的推移最多进行了8次升级,我只关心最新的。
客户端我从运行SQL Server 2000中提取此数据。
答案 0 :(得分:5)
SQL Server 2000的典型解决方案是隔离employeeseno及其最大日期(这在2005年更容易)。伪代码:
SELECT d.columns, etc. FROM
(
SELECT employeeno, [date] = MAX([date])
FROM dbo.tablewithdates
GROUP BY employeeno
) AS grouped_emp
INNER JOIN dbo.tablewithdates AS d
ON d.employeeno = grouped_emp.employeeno
AND d.[date] = grouped_emp.[date]
INNER JOIN ...
危险在于,如果employeeno + date不是唯一的,你可以得到多行,所以你需要确定如何处理关系。
我会为你的架构编写它,但我不能对你的查询进行反向工程以找出哪个表是哪个。开始简单并开始工作。
答案 1 :(得分:0)
HAVING子句发生在group by之后,因此它只能使用聚合列。
您需要在组之前计算最大日期。这需要在子查询中添加计算,然后在WHERE子句中进行正确的过滤:
SELECT KM.initials, TPL.debprice, TMP.pricegroup, TMP.date
FROM klientmedarbejder KM INNER JOIN
timeprismedarbejderprisgruppe TMP
ON KM.employeeno = TMP.employeeno INNER JOIN
timeprisprisgruppelinie TPL
ON TMP.pricegroup = TPL.pricegroup join
(select employeeno, MAX(dato) as maxdato
from timeprismedarbejderprisgruppe t
group by employeeno
) tmax
on tmax.employeeno = tmp.employeeno
where tmp.dato = tmax.maxdato
GROUP BY KM.initials, TMP.date, TPL.debprice, TMP.pricegroup, TPL.date