0

我需要一点帮助才能让这个脚本做我想做的事。

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是您可以拥有的价格列表。

我的解决方案减少到每位员工 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。

4

2 回答 2

5

SQL Server 2000 的典型解决方案是隔离员工编号及其最大日期(这在 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 不是唯一的,您可能会得到多行,因此您需要确定如何处理关系。

我会为您的架构编写它,但我无法对您的查询进行逆向工程以确定哪个表是哪个表。从简单开始,然后努力。

于 2012-06-25T14:23:13.603 回答
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
于 2012-06-25T14:26:56.593 回答