2012-08-29 54 views
0

業務規則:我們只能爲每90天的跟進事件收費。任何發生在前一個事件發生後不到90天的事件都不能收費,但需要記錄。SQL頂部和加入

用戶要求:他們希望看到他們提交當前事件賬單的標籤上提交的最後一個事件賬單的日期,以提供提交賬單是否值得做的視覺提示。

事件在表事件中有一個event_id和一個event_date。 Event_id是表event_bill中的外鍵,它具有賬單的submitted_date。 對於每個客戶,事件都有一個外鍵customer_id,因此客戶可以在任何時間段都有多個事件。

鑑於目前的event_id和customer_id,我正在嘗試獲取最近一次上一個事件的submitted_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 

任何人都可以給我一個更好的方法來解決這個問題嗎?

回答

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 
+0

非常感謝您的幫助!現在我明白了這一點,更有意義的是,我不得不重新加入事件表。 –

+0

我很高興我可以幫你:) – Parado

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 
    ) 
+0

它是sybase-ase,沒有選項'限制1' – Parado

0

我倒覺得ORDER BY將與頂部被接受。如果沒有,你可以這樣做:

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,然後將它用於連接。

+0

這個問題是客戶ID和event_date只在事件中發生,event_bill只有event_id和submitted_date,這與event_date不同。 –