0

ビジネスルール:フォローアップイベントの請求は90日ごとにのみ可能です。前のイベントから90日以内に発生したイベントは請求できませんが、記録する必要があります。

ユーザー要件:最後のイベント請求書が提出された日付を、現在のイベントの請求書を提出するタブで確認し、請求書を提出する価値があるかどうかを視覚的に確認したいと考えています。

イベントには、テーブルイベントにevent_idとevent_dateがあります。Event_idは、請求書のsubmited_dateを持つテーブルevent_billの外部キーです。イベントには、顧客ごとに外部キーcustomer_idがあるため、顧客は任意の期間に複数のイベントを持つことができます。

現在のevent_idとcustomer_idを指定して、最新の前のイベントのsubmited_dateを取得しようとしています。

これが私が試したことです:

    SELECT TOP 1 (event_id) as prev_event_id
    INTO #tmp
    FROM  event 
    WHERE customer_id = @custID
    AND event_type = 'Followup'
    AND event_id < @eventID 
    ORDER BY event_date DESC

    SELECT eb.submitted_date
    FROM event_bill eb
    JOIN #tmp
    ON eb.event_id = #tmp.prev_event_id

    DROP TABLE #tmp

これはすべてうまくいくでしょうが、私のアプリケーションのデータベース権限では一時テーブルの作成が許可されていません。

一時テーブルを使用せずに試行すると、派生テーブルでORDER BYを使用できないというエラーが発生しましたが、この顧客の現在のイベントより前の最後のイベントを確実に取得するために必要です。

    SELECT eb.submitted_date
    FROM event_bill eb
    JOIN
    (
    SELECT TOP 1 (event_id) as prev_event_id
    FROM  event 
    WHERE customer_id = @custID
    AND event_type = 'Followup'
    AND event_id < @eventID 
    ORDER BY event_date DESC
    ) x
    ON eb.event_id = x.prev_event_id

誰かが私にこれにアプローチするためのより良い方法を教えてもらえますか?

4

3 に答える 3

0

これを試して :)

SELECT eb.submitted_date
FROM event_bill eb
WHERE
  eb.event_id IN (
    SELECT event.event_id 
    FROM event 
    WHERE 
      event.customer_id = @custID 
      AND event.event_type = 'Followup'
      AND event.event_id < @eventID
    ORDER BY event_date DESC
     LIMIT 1
   )
于 2012-08-29T18:47:04.707 に答える
0

多分それはあなたを助けるでしょう

 SELECT eb.submitted_date
    FROM event_bill eb
    JOIN
    (
    SELECT event_id as prev_event_id
    FROM  event 
    WHERE customer_id = @custID
    AND event_type = 'Followup'
    AND event_id < @eventID 
    and event_date = 
    (
      select max(event_date)
      FROM  event 
      WHERE customer_id = @custID
      AND event_type = 'Followup'
      AND event_id < @eventID 
    )
    ) x
    ON eb.event_id = x.prev_event_id
于 2012-08-29T18:47:56.203 に答える
0

ORDERBYはトップで受け入れられると思います。そうでない場合は、これを行うことができます:

 SELECT eb.submitted_date
 FROM event_bill eb JOIN
      event e
      on eb.event_id = e.event_id join
      (SELECT customer_id, MAX(eventdate) as maxdate
       FROM  event
       WHERE customer_id = @custID AND
            event_type = 'Followup' AND
            event_id < @eventID
       group by customer_id
      ) md
     ON e.customer_id = md.customer_id and
        eb.event_date = md.maxdate

これはmaxdateを計算し、これを結合に使用します。

于 2012-08-29T18:48:13.197 に答える