2014-09-23 26 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;