需要一些帮助,SQL Server 2000,有和最大(日期)

时间:2012-06-25 14:14:59

标签: sql sql-server sql-server-2000 max having

我需要一些帮助,让这个脚本按照我的意愿行事。

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。一名员工经历了他的职业生涯,偶尔他的价格会升级。价格从一组价格中选择。

  1. KlientMedarbejder是员工表。
  2. TimeprisMedarbejderPrisgruppe是他的记录升级到新价格的日期列表。
  3. TimeprisPrisgruppeLinie是您可以拥有的价格列表。
  4. 我的解决方案是每位员工最多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中提取此数据。

2 个答案:

答案 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