2017-03-21 4 views
0

sql-serverでrownumber関数を使用しているときに変換エラーが発生しました。私は似たようなスレッドがたくさん掲載されていることを知っていますが、iveはそれらを見て、彼らは異なった問題を抱えています。varchar値 'RN'をデータ型intに変換するときに変換に失敗しました

varchar値 'RN'をデータ型intに変換するときに変換に失敗しました。

問題がどこで発生しているのかわかりません。誰もがそれがrownumber関数から離れて間違って行くことができるのアイデアを持っていますか?

このCTEは、前のトランザクション

, PRETRANSACTIONS AS (

    SELECT DISTINCT 

    CONT.POH_ID            AS POH_ID 
    ,CONT.POH_POLICYNUMBER          AS Contract_Number 

    ,row_number() over (
    partition by CONT.POH_ID 
    order by TRANS.txh_effectivedate desc 
    )               AS 'RN' 

    ,TXN_STAT.Txs_DESCRIPTION_I         AS Transaction_Status_2 
    ,TRANS.txh_effectivedate         AS Transaction_Date_2 
    ,TXN_DES.Txt_DESCRIPTION_I         AS Transaction_Type_2 
    ,TRX_RES.TRE_AMTPROCESSED         AS Transaction_Amount_2 

    From Se2FAST.dbo.Cm_Opt_Poh_PolicyHdr_S CONT 

    JOIN BASE BASE 
     ON BASE.Poh_ID = CONT.POH_ID 

    INNER JOIN Se2FAST.dbo.Cm_Opt_Pch_PolicyCovHdr_S policyCov 
     ON CONT.Poh_ID = policyCov.Pch_POLICYHDRID 
     AND policycov.pch_sequence = 1 
    INNER JOIN [dbo].[Cm_Sys_Pst_PolicyStatus_I] PST 
     ON PST.Pst_ID_I = CONT.Poh_Status  
    LEFT JOIN se2Fast.DBO.CM_OPT_TXH_TRXHDR_S TRANS 
     ON TRANS.TXH_POLICYHDRID = CONT.POH_ID 

    AND TRANS.txh_effectivedate < (SELECT TOP 1 TRAN1.txh_effectivedate 
            FROM se2Fast.DBO.CM_OPT_TXH_TRXHDR_S TRAN1 
            WHERE TRAN1.TXH_POLICYHDRID = CONT.POH_ID 
            ORDER BY txh_effectivedate DESC)          

    LEFT JOIN se2Fast.dbo.Cm_Opt_Tre_TrxRes_S AS TRX_RES 
     ON TRANS.Txh_ID = TRX_RES.Tre_TRXHDRID 
    LEFT JOIN se2Fast.dbo.Cm_Sys_Txt_TrxType_I TXN_DES 
     ON TRANS.Txh_TRXTYPEID = TXN_DES.Txt_ID_I 
     --AND TXN_DES.Txt_DESCRIPTION_I NOT IN (   
     --'Anniversary','Monthiversary','Quarterversary','Calendar Year End') 
     --AND TXN_DES.Txt_DESCRIPTION_I IS NOT NULL 
    LEFT JOIN se2Fast.dbo.Cm_Sys_Txs_TrxStatus_I TXN_STAT 
     ON Trans.Txh_TRXSTATUS = TXN_STAT.Txs_ID_I 
     AND TXN_STAT.Txs_DESCRIPTION_I = 'Completed' 

    WHERE 'RN' = 2 

)を取得している

+2

'WHERE' RN '= 2'の代わりに 'WHERE RN = 2'を試してください。 – GurV

+1

...' AS' RN''を避けてください。 'AS RN'を使うことができます(二重引用符は二つありません)。 – etsa

答えて

0

'RN' = 2は2つの値を比較している、文字列 'RN' と整数2は、SQL Serverが式を解析するときにWHERE整数比較を実行するために、リテラル値 'RN'を数値に変換しようとしています。明らかに、RNは数値に変換できないため、エラーが発生します。

SQL Serverでは、エイリアスはWHERE/GROUP/HAVING句の後、ORDER BY句の前に現れます。つまり、割り当てられたクエリのフィルタ内でエイリアスを使用することはできません。比較で使用する前に、サブクエリで列エイリアスを生成する必要があります。


あなたのクエリが混ざっているようです。あなたは 'PRETRANSACTIONS'という名前のCTEとして起動しましたが、それを閉じ括弧の後の列、AS 'RN'の別名にしようとしました。 SELECTの列を使用する前に、FROMでCTEを参照する必要があります。これが単なる列式であれば、始めに 'PRETRANSACTIONS AS'を取り除いてください。別のノートで

WITH PRETRANSACTIONS AS (

    SELECT DISTINCT 

    CONT.POH_ID            AS POH_ID 
    ,CONT.POH_POLICYNUMBER          AS Contract_Number 

    ,row_number() over (
    partition by CONT.POH_ID 
    order by TRANS.txh_effectivedate desc) 
                   AS RN) 

    SELECT RN, 
TXN_STAT.Txs_DESCRIPTION_I         AS Transaction_Status_2 
    ,TRANS.txh_effectivedate         AS Transaction_Date_2 
    ,TXN_DES.Txt_DESCRIPTION_I         AS Transaction_Type_2 
    ,TRX_RES.TRE_AMTPROCESSED         AS Transaction_Amount_2 

    From Se2FAST.dbo.Cm_Opt_Poh_PolicyHdr_S CONT 

    JOIN BASE BASE 
     ON BASE.Poh_ID = CONT.POH_ID 
JOIN PRETRANSACTIONS 
ON BASE.POH_ID = PRETRANSACTIONS.POH_ID 
    INNER JOIN Se2FAST.dbo.Cm_Opt_Pch_PolicyCovHdr_S policyCov 
     ON CONT.Poh_ID = policyCov.Pch_POLICYHDRID 
     AND policycov.pch_sequence = 1 
    INNER JOIN [dbo].[Cm_Sys_Pst_PolicyStatus_I] PST 
     ON PST.Pst_ID_I = CONT.Poh_Status  
    LEFT JOIN se2Fast.DBO.CM_OPT_TXH_TRXHDR_S TRANS 
     ON TRANS.TXH_POLICYHDRID = CONT.POH_ID 

    AND TRANS.txh_effectivedate < (SELECT TOP 1 TRAN1.txh_effectivedate 
            FROM se2Fast.DBO.CM_OPT_TXH_TRXHDR_S TRAN1 
            WHERE TRAN1.TXH_POLICYHDRID = CONT.POH_ID 
            ORDER BY txh_effectivedate DESC)          

    LEFT JOIN se2Fast.dbo.Cm_Opt_Tre_TrxRes_S AS TRX_RES 
     ON TRANS.Txh_ID = TRX_RES.Tre_TRXHDRID 
    LEFT JOIN se2Fast.dbo.Cm_Sys_Txt_TrxType_I TXN_DES 
     ON TRANS.Txh_TRXTYPEID = TXN_DES.Txt_ID_I 
     --AND TXN_DES.Txt_DESCRIPTION_I NOT IN (   
     --'Anniversary','Monthiversary','Quarterversary','Calendar Year End') 
     --AND TXN_DES.Txt_DESCRIPTION_I IS NOT NULL 
    LEFT JOIN se2Fast.dbo.Cm_Sys_Txs_TrxStatus_I TXN_STAT 
     ON Trans.Txh_TRXSTATUS = TXN_STAT.Txs_ID_I 
     AND TXN_STAT.Txs_DESCRIPTION_I = 'Completed' 

    WHERE PRETRANSACTIONS.RN = 2 

、ROW_NUMBERと同じセットでDISTINCTを使用することはありません。 ROW_NUMBERはすべての行に一意の番号を生成するため、すべての行が区別されます。行を削除せずに並べ替えのオーバーヘッドを追加するだけです。代わりに、RANKまたはDENSE_RANKを使用できます。

+0

最初の部分では暗黙の変換について間違っています。この場合、常にエラーが発生しているより高い優先順位に変換しようとします。 –

+0

@SeanLangeあなたは正しいです。私は多分を削除するために私の答えを更新しました。 –

0

'RN'は使用しないでください。

0

テキスト値 'RN'とwhere句の整数値2を比較しているため、このエラーが発生しています。しかし、「RN」以来の列であり、あなたはそれのように引用符なし

WHERE RN = 2 

RNを入力代わり

WHERE **'RN'** = 2 

のフィールド「RN」に値2を持つすべてのファイルを返すようにしたいです列の名前です。

関連する問題