2009-10-13 3 views
1

Я работаю со следующим запросом. Я хочу использовать Date_Sent_to_Recorder в моих других вычислениях, которые следуют. Я получаю сообщение об ошибке «Недопустимое имя столбца« Date_Sent_to_Recorder ».» Люди рекомендовали использовать CTE для этого, но я не могу поместиться в этом scenerio.I имеет коррелированный подзапрос, который вычисляет Date_Sent_to_Recorder.Пожалуйста, помогите.использовать псевдоним столбца в других вычислениях в sql server 2005

SELECT  
C.Name Client , 
SecONdary_Document.Primary_Document_ID , 
SecONdary_Document.Secondary_Document_Id , 
Primary_Document.State + ',' + GB_Counties.CountyName State , 
Grantor.Name Grantor , 
Loan_Number , 
CONVERT(VARCHAR(10), Primary_Document.PIF_Date, 101) PIF_Date , 

    (SELECT CASE WHEN dbo.SECONDARY_DOCUMENT.Status_ID = 21 
            THEN CONVERT(VARCHAR(10), dbo.SECONDARY_DOCUMENT.Updated_Dt, 101) 
            ELSE (SELECT TOP 1 
                CONVERT(VARCHAR(10), dbo.SECONDARY_DOCUMENT_STATUS_HISTORY.Created_Dt, 101) 
              FROM dbo.SECONDARY_DOCUMENT_STATUS_HISTORY 
              WHERE dbo.SECONDARY_DOCUMENT_STATUS_HISTORY.Secondary_Document_ID = SecONdary_Document.Secondary_Document_Id 
                AND SECONDARY_DOCUMENT_STATUS_HISTORY.Status_ID = 21 
              ORDER BY dbo.SECONDARY_DOCUMENT_STATUS_HISTORY.Created_Dt DESC 
             ) 
           END 
        ) AS Date_Sent_to_Recorder , 

        Satis_TimeFrame , 
        CASE WHEN PIF_Date IS NULL 
           OR Date_Sent_to_Recorder IS NULL THEN NULL 
         ELSE DATEDIFF(DAY, PIF_Date, 
             Date_Sent_to_Recorder) 
        END TotalDays , 
        CASE WHEN PIF_Date IS NULL 
           OR Date_Sent_to_Recorder IS NULL THEN NULL 
         ELSE CASE WHEN DATEDIFF(DAY, PIF_Date, 
               ISNULL(Date_Sent_to_Recorder, 
                 GETDATE())) > Satis_TimeFrame 
            THEN 'N' 
            ELSE 'Y' 
           END 
        END InCompliance , 
        Loan_Name , 
        Deal_Name , 
        Deal.Deal_Id , 
        Loan.Loan_Id 
      FROM  Primary_Document 
        INNER JOIN SecONdary_Document ON SecONdary_Document.Primary_Document_ID = Primary_Document.Primary_Document_ID 
        INNER JOIN Status ON Status.Status_Id = SecONdary_Document.Status_Id 
        INNER JOIN GB_Counties ON GB_Counties.CountyId = Primary_Document.County_Id 
        INNER JOIN Loan ON Loan.Loan_Id = Primary_Document.Loan_Id 

EDIT ------------

DECLARE @Date_Sent_to_Recorder varchar(10) 
SELECT C.Name Client , 
    SecONdary_Document.Primary_Document_ID , 
    SecONdary_Document.Secondary_Document_Id , 
    Primary_Document.State + ',' + GB_Counties.CountyName State , 
    Grantor.Name Grantor , 
    Loan_Number , 
    CONVERT(VARCHAR(10), Primary_Document.PIF_Date, 101) PIF_Date , 
                --<START> 
                --3021,RRaghuvansi,If current status is 21 in SECONDARY_DOCUMENT then take Updated_Dt else take Created_Dt in SECONDARY_DOCUMENT_STATUS_HISTORY with status Out For Recorder               
                --CONVERT(VARCHAR(20), Recording_Date, 101) AS Recording_Date , 

    @Date_Sent_to_Recorder=[dbo].[GET_RecordingDate](SecONdary_Document.Secondary_Document_Id),            --<END> 
    Satis_TimeFrame , 

    Loan_Name , 
    Deal_Name , 
    Deal.Deal_Id , 
    Loan.Loan_Id 
FROM Primary_Document 

ответ

2

Поскольку ваша схема является своего рода неясными, вот краткий пример для производного синтаксисе таблицы и референцирование значения из производной таблицы

Declare @Sample table(id1 int, id2 int, value varchar(20)) 

insert into @sample values (1,1, 'this') 
insert into @sample values(2,2, 'that') 
insert into @sample values(3,2, 'the other') 

Select t1.ID1, t1.Value, t2.RevVal, 
case 
when t2.RevVal = 'siht' then 1 else 0 
end as RevIsThisBackwards 
from @sample t1 
inner join (Select id1, reverse(value) as RevVal from @sample) t2 
on t1.ID1 = t2.ID1 

Результаты

id VALUES Rev  Rev Value is this backwards 
    1 this siht 1 
    2 that taht 0 
    3 the other rehto eht 0 

Таким образом, вы захотите перенести вычисленный столбец и достаточные столбцы на присоединиться к в производной таблице, в вашем случае это будет он будет выглядеть примерно ниже

INNER JOIN Loan ON Loan.Loan_Id = Primary_Document.Loan_Id 
    INNER JOIN (Select SomPKField, CASE WHEN dbo.SECONDARY_DOCUMENT.Status_ID = 21 
     THEN CONVERT(VARCHAR(10), dbo.SECONDARY_DOCUMENT.Updated_Dt, 101) 
     ELSE (SELECT TOP 1 
     CONVERT(VARCHAR(10), dbo.SECONDARY_DOCUMENT_STATUS_HISTORY.Created_Dt, 101) 
      FROM dbo.SECONDARY_DOCUMENT_STATUS_HISTORY 
    WHERE 
dbo.SECONDARY_DOCUMENT_STATUS_HISTORY.Secondary_Document_ID = SecONdary_Document.Secondary_Document_Id 
      AND SECONDARY_DOCUMENT_STATUS_HISTORY.Status_ID = 21 
      ORDER BY dbo.SECONDARY_DOCUMENT_STATUS_HISTORY.Created_Dt DESC 
     ) 
     END as Date_Sent_to_Recorder 
    ) as Sub1 
    on SomeTable.SomePKField = Sub1.SomePKField 


**I edit your edit in this edit.** 

SELECT C.Name Client , 
    SecONdary_Document.Primary_Document_ID , 
    SecONdary_Document.Secondary_Document_Id , 
    Primary_Document.State + ',' 
    + GB_Counties.CountyName State , 
    Grantor.Name Grantor , 
    Loan_Number , 
    CONVERT(VARCHAR(10), Primary_Document.PIF_Date, 101) PIF_Date , 
    [dbo].[GET_RecordingDate] 
    (SecONdary_Document.Secondary_Document_Id) 
    As Date_Sent_To_Recorder 
    Satis_TimeFrame , 
    Loan_Name , 
    Deal_Name , 
    Deal.Deal_Id , 
    Loan.Loan_Id 
FROM Primary_Document 
+0

Могу ли я использовать функцию, поскольку у меня есть коррелированный подзапрос, в котором я нахожу эту дату для всех Secondary_Document_ID, которые есть в списке выбора. Что думает, чтобы создать эту функцию с параметром Secondary_Document_ID и использовать эту функцию в списке выбора а затем используйте переменную, чтобы получить эту дату. – Rohit

+0

Я не вижу причин, почему вы не могли использовать встроенную функцию. – cmsjr

+0

, когда я присваиваю значение переменной, он говорит: «Оператор SELECT, который присваивает значение переменной, не должен сочетаться с операциями извлечения данных». Как справиться с этим – Rohit

0

Вы не можете обратиться к вычисляемого столбца в других столбцах SELECT. Самое простое решение для того, что вы пытаетесь достичь, - это предварительно вычислить Date_Sent_to_Recorder и сохранить его во временной таблице, а затем присоединиться к этой таблице при выполнении основного запроса.

Protip: используйте правильное форматирование и псевдонимы таблицы; SQL, как вы опубликовали, трудно читать, и почти невозможно понять.

Edit: что-то вроде этого:

create table #temp 
      (Primary_Document_ID int, 
      Date_Sent_To_Recorder datetime) 

insert #temp 
select Primary_Document_ID, 
     CASE 
     WHEN dbo.SECONDARY_DOCUMENT.Status_ID = 21 
      THEN CONVERT(VARCHAR(10), dbo.SECONDARY_DOCUMENT.Updated_Dt, 101) 
     ELSE 
      (SELECT TOP 1 
        CONVERT(VARCHAR(10), dbo.SECONDARY_DOCUMENT_STATUS_HISTORY.Created_Dt, 101) 
       FROM dbo.SECONDARY_DOCUMENT_STATUS_HISTORY 
      WHERE dbo.SECONDARY_DOCUMENT_STATUS_HISTORY.Secondary_Document_ID = SecONdary_Document.Secondary_Document_Id 
       AND SECONDARY_DOCUMENT_STATUS_HISTORY.Status_ID = 21 
      ORDER BY dbo.SECONDARY_DOCUMENT_STATUS_HISTORY.Created_Dt DESC) 
     END 
    from SecONdary_Document 

-- main select, joining to #temp 
+0

нормально, я форматировать его в следующий раз я буду размещать некоторые запрос. – Rohit

0

Поскольку Date_Sent_to_Recorder зависит только от SECONDARY_DOCUMENT & SECONDARY_DOCUMENT_STATUS_HISTORY таблиц, вы можете заменить SECONDARY_DOCUMENT в INNER JOIN следующим (что дает Date_Sent_to_Recorder как столбец):

SELECT SD.Primary_Document_ID, 
        SD.Secondary_Document_Id, 
        CASE WHEN SD.Status_ID = 21 
         THEN CONVERT(VARCHAR(10), SD.Updated_Dt, 101) 
         ELSE CONVERT(VARCHAR(10), SDSH.Created_Dt, 101) 
        END Date_Sent_to_Recorder 
       FROM SECONDARY_DOCUMENT SD 
     INNER JOIN dbo.SECONDARY_DOCUMENT_STATUS_HISTORY SDSH 
       ON SDSH.Secondary_Document_ID = SD.Secondary_Document_Id 
       AND SDSH.Status_ID = 21 
     INNER JOIN (SELECT Secondary_Document_ID, max(Created_Dt) Created_Dt 
         FROM dbo.SECONDARY_DOCUMENT_STATUS_HISTORY 
        WHERE Status_ID = 21 
        GROUP BY Secondary_Document_ID) SDSH2 
       ON SDSH.Secondary_Document_ID = SDSH2.Secondary_Document_Id 
       AND SDSH.Created_Dt = SDSH2.Created_Dt 

и, наконец, у вас есть:

SELECT C.Name Client, 
     SecONdary_Document.Primary_Document_ID, 
     SecONdary_Document.Secondary_Document_Id, 
     Primary_Document.State + ',' + GB_Counties.CountyName State, 
     Grantor.Name Grantor, 
     Loan_Number, 
     CONVERT(VARCHAR(10), Primary_Document.PIF_Date, 101) PIF_Date, 
     SecONdary_Document.Date_Sent_to_Recorder, 
     Satis_TimeFrame, 
     CASE WHEN PIF_Date IS NULL 
       OR SecONdary_Document.Date_Sent_to_Recorder IS NULL 
      THEN NULL 
      ELSE DATEDIFF(DAY, PIF_Date, 
           SecONdary_Document.Date_Sent_to_Recorder) 
     END TotalDays, 
     CASE WHEN PIF_Date IS NULL 
       OR SecONdary_Document.Date_Sent_to_Recorder IS NULL THEN NULL 
      ELSE CASE WHEN DATEDIFF(DAY, PIF_Date, 
           ISNULL(SecONdary_Document.Date_Sent_to_Recorder 
           ,GETDATE())) > Satis_TimeFrame 
         THEN 'N' 
         ELSE 'Y' 
       END 
     END InCompliance, 
     Loan_Name, 
     Deal_Name, 
     Deal.Deal_Id, 
     Loan.Loan_Id 
FROM Primary_Document 
INNER JOIN (SELECT SD.Primary_Document_ID, 
        SD.Secondary_Document_Id, 
        CASE WHEN SD.Status_ID = 21 
         THEN CONVERT(VARCHAR(10), SD.Updated_Dt, 101) 
         ELSE CONVERT(VARCHAR(10), SDSH.Created_Dt, 101) 
        END Date_Sent_to_Recorder 
       FROM SECONDARY_DOCUMENT SD 
     INNER JOIN dbo.SECONDARY_DOCUMENT_STATUS_HISTORY SDSH 
       ON SDSH.Secondary_Document_ID = SD.Secondary_Document_Id 
       AND SDSH.Status_ID = 21 
     INNER JOIN (SELECT Secondary_Document_ID, max(Created_Dt) Created_Dt 
         FROM dbo.SECONDARY_DOCUMENT_STATUS_HISTORY 
        WHERE Status_ID = 21 
        GROUP BY Secondary_Document_ID) SDSH2 
       ON SDSH.Secondary_Document_ID = SDSH2.Secondary_Document_Id 
       AND SDSH.Created_Dt = SDSH2.Created_Dt) SecONdary_Document 
     ON SecONdary_Document.Primary_Document_ID 
          = Primary_Document.Primary_Document_ID 
INNER JOIN Status ON Status.Status_Id = SecONdary_Document.Status_Id 
INNER JOIN GB_Counties ON GB_Counties.CountyId = Primary_Document.County_Id 
INNER JOIN Loan ON Loan.Loan_Id = Primary_Document.Loan_Id 
Смежные вопросы