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年、彼は最終的により良い値札を付けるのに十分になりました. ここで、各従業員のアップグレード リストの最新の日付を含む回答が必要です。したがって、従業員 A は私に 500 を与える必要があり、従業員 B は私に 800 を与える必要があります。一部の従業員は、時間の経過とともに最大 8 回のアップグレードを行っていますが、私は最新のものだけを気にしています。

このデータを取得しているクライアントは、SQL Server 2000 を実行しています。

4

2 に答える 2

5

SQL Server 2000 の典型的な解決策は、employeeno とその最大日付を分離することです (これは 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 に答える