2014-09-23 28 views
0

我嘗試過這種方案有很多種方法,並且無法獲得正確的語法,以便最大限度地提高結果。 (對不起,但這是在一個SQL 2000服務器上)在select語句中嵌入case中的join(SQL)

我會升級,除非應用程序可能打破對它的運行。 因此,我試圖根據(如果案例已關閉)拉出最大數量的結果。但是我不希望「唯一」的innerjoin的情況下,試圖

SELECT DISTINCT CASE.CASENUM  AS Case#, 
       CASE.Lastname  AS [Client Name], 
       event.actiondate AS [Last Action in Event], 
       event.description AS [Last Event], 
       CASE.statcode  AS [Case Status], 
       transmdf.amount, 
       transmdf.postdate [Last ActionDate], 
       transmdf.description AS [Last Fin. Action] 
FROM   Transmdf 
INNER JOIN 
       ( 
         SELECT CASENUM, 
            MAX(postdate) AS latest 
         FROM  Transmdf 
         GROUP BY CASENUM) YYY 
ON    transmdf.CASENUM = YYY.CASENUM 
AND    transmdf.postdate = YYY.latest 
INNER JOIN  event 
ON    transmdf.casenum = event.casenum 
INNER JOIN 
       ( 
         SELECT CASENUM, 
            MAX(actiondate) AS latest 
         FROM  EVENT 
         GROUP BY CASENUM) XXX 
ON    EVENT.CASENUM = XXX.CASENUM 
AND    EVENT.ACTIONDATE = XXX.latest 
INNER JOIN 
       CASE 
           ON    transmdf.casenum = CASE.casenum 
           WHERE   CASE.statcode = 'c' 
           ORDER BY  CASE.lastname 

時候,但是我碰到什麼削減可能5000箱子了我返回的結果。

理想情況下,我想要做的是拉的所有結果案件是「關閉」過了某個日期。

有一個caviat的......這些情況下返回

  1. 顯示在事件表中的最後(最近)動作(日期&說明)(用於查詢的每個客戶端)

  2. 以及他們的最後(最近)的金融交易(金額/日期/說明)(用於查詢的每個客戶端)

幫助?

+0

正如我所說,..使用內部連接,導致我失去了一些事例(約4000),因爲它只查找「Event」或「Transmdf」條目。如果我查看那些在我需要的日期範圍內關閉的案例表,則會返回9000個案例。只要我進入內部連接,它將列表縮小到約5000個案例。 – spidervarient 2014-09-23 22:23:53

回答

0

CasedescriptionEvent都是關鍵的話,那麼你需要的時候,他們被用作對象的名稱,而不是一個關鍵字,在SQL Server對象名稱一個不錯的選擇使用方括號[]圍繞這些話。

;With [event] AS 
(
    SELECT actiondate , [description] , casenum 
     , ROW_NUMBER() OVER (PARTITION BY casenum ORDER BY actiondate DESC) rn 
    FROM [event] 
), 
transmdf AS 
(
    SELECT amount, postdate , [description], CASENUM 
     , ROW_NUMBER() OVER (PARTITION BY casenum ORDER BY postdate DESC) rn 
    FROM Transmdf 
) 
SELECT [Case].CASENUM   AS [Case] 
     ,[Case].Lastname   AS [Client Name] 
     ,[event].actiondate  AS [Last Action in Event] 
     ,[event].[description] AS [Last Event] 
     ,[Case].statcode   AS [Case Status] 
     ,transmdf.amount   AS [Amount] 
     ,transmdf.postdate  AS [Last ActionDate] 
     ,transmdf.[description] AS [Last Fin. Action] 
FROM [Case] 
INNER JOIN transmdf ON transmdf.casenum = [Case].casenum AND transmdf.rn = 1 
INNER JOIN [event] ON transmdf.casenum = [event].casenum AND [event].rn = 1 
WHERE [Case].statcode = 'c' 
ORDER BY [Case].lastname 
+0

試圖使用您的代碼出錯。顯示以下問題...服務器:消息170,級別15,狀態1,行1 行1:';'附近的語法不正確。 服務器:消息195,級別15,狀態1,行3 「ROW_NUMBER」不是可識別的函數名稱。 服務器:消息195,級別15,狀態1,行9 「ROW_NUMBER」不是可識別的函數名稱。 – spidervarient 2014-09-24 21:12:41

+0

由於您現在只提到您正在使用SQL Server 2000,因此此解決方案不適用於您,因爲它不支持CTE或排名功能。你應該在這之前提到過你使用的是什麼版本。 – 2014-09-24 21:16:48

0

case是保留字,所以它是一個表名一個不錯的選擇。我認爲以下應該更容易解析SQL Server。

SELECT distinct case.CASENUM AS Case#, c.Lastname AS [Client Name], 
     e.actiondate as [Last Action in Event], e.description as [Last Event], 
     c.statcode as [Case Status], t.amount, t.postdate as [Last ActionDate], 
     t.description as [Last Fin. Action] 
FROM Transmdf t INNER JOIN 
    (SELECT CASENUM, MAX(postdate) AS latest 
     FROM Transmdf 
     GROUP BY CASENUM 
    ) YYY 
    ON t.CASENUM = YYY.CASENUM AND transmdf.postdate = YYY.latest Inner join 
    event e 
    on t.casenum = e.casenum INNER JOIN 
    (SELECT CASENUM, MAX(actiondate) AS latest 
     FROM EVENT 
     GROUP BY CASENUM 
    ) XXX 
    ON e.CASENUM = XXX.CASENUM AND e.ACTIONDATE = XXX.latest inner join 
    [case] c 
    on t.casenum = c.casenum 
where c.statcode = 'c' 
ORDER BY c.lastname;