2014-09-23 2 views
0

Я пробовал этот сценарий несколькими способами и не могу получить синтаксис правильно, чтобы максимизировать результаты. (извините, но это на сервере SQL 2000)Вложение a Присоединиться к случаю в выражении select (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. показывая Последний (самый последний) Action (дата & описание) в таблице событий (для каждого клиента запроса)

  2. , а также их последний (самый последний) финансовые сделки (сумма/дата/описание) (для каждого клиента запроса)

Помощь ??

+0

Как я уже говорил, использование внутреннего соединения приводит к тому, что я теряю несколько случаев (около 4000), поскольку он смотрит только в таблицы «Событие» или «Transmdf» для своих эксклюзивных записей. Если я посмотрю таблицу case для тех, которые были закрыты в течение диапазона дат, который мне нужен, возвращается 9000 случаев. Как только я вхожу во внутренние соединения, он сокращает список до 5000 случаев. – spidervarient

ответ

0

Case, description и Event все ключевые слова, так что вам нужно будет использовать квадратные скобки [] вокруг этих слов, когда они используются в качестве имен объектов, а не ключевое слово, плохой выбор для имен объектов в 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

, пытающийся использовать ваш код с ошибкой. показывая следующие проблемы ... Сервер: Msg 170, уровень 15, состояние 1, строка 1 Строка 1: неправильный синтаксис рядом с;;. Сервер: Msg 195, уровень 15, состояние 1, строка 3 «ROW_NUMBER» не является признанным именем функции. Сервер: Msg 195, уровень 15, состояние 1, строка 9 «ROW_NUMBER» не является признанным именем функции. – spidervarient

+0

Поскольку вы только упоминали, что используете SQL Server 2000, это решение не будет работать для вас, так как оно не будет поддерживать функции CTE или Ranking. Вы должны были упомянуть об этом до того, какую версию вы используете. –

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; 
Смежные вопросы