2017-03-21 6 views
0

Was ich versuche zu bekommen ist eine Liste der letzten Transaktion für jedes Konto, die etwa 300 ergeben sollte. Dann möchte ich nebenbei die vorherige Transaktion auflisten.SQL - Liste der letzten Transaktionen und Transaktionen vor der letzten

Also ich benutze die MAX (Transaction_Date), die die Liste der letzten Transaktionen in Ordnung bringen. Das Problem ist, wenn ich versuche, die Transaktion vor der letzten Transaktion zu erhalten.

Es multipliziert die Ergebnisse auf etwa 4000, wenn die Summe immer noch 300 sein sollte. Es scheint ein Problem mit der Verknüpfung zu geben.

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 

    -- GETS THE LAST TRANSACTION 

    LEFT JOIN se2Fast.DBO.CM_OPT_TXH_TRXHDR_S TRANS 
     ON TRANS.TXH_POLICYHDRID = CONT.POH_ID 

     AND TRANS.txh_effectivedate < (SELECT MAX(TRAN1.txh_effectivedate) FROM se2Fast.DBO.CM_OPT_TXH_TRXHDR_S TRAN1 WHERE TRAN1.TXH_POLICYHDRID = CONT.POH_ID)          

    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 

    LEFT JOIN se2Fast.dbo.Cm_Sys_Txs_TrxStatus_I TXN_STAT 
     ON Trans.Txh_TRXSTATUS = TXN_STAT.Txs_ID_I 

    -- GETS THE 2ND TO LAST TRANSACTION 

    LEFT JOIN se2Fast.DBO.CM_OPT_TXH_TRXHDR_S TRANSX 
     ON TRANSX.TXH_POLICYHDRID = CONT.POH_ID 
     AND TRANS.txh_effectivedate < ( SELECT MAX(TRANA.txh_effectivedate) 
              FROM se2Fast.DBO.CM_OPT_TXH_TRXHDR_S TRANA 
              WHERE TRANA.TXH_POLICYHDRID = CONT.POH_ID 
              AND TXN_STAT.Txs_DESCRIPTION_I = 'Completed') 

    LEFT JOIN se2Fast.dbo.Cm_Sys_Txt_TrxType_I TXN_DESX 
     ON TRANSX.Txh_TRXTYPEID = TXN_DESX.Txt_ID_I 

    LEFT JOIN se2Fast.dbo.Cm_Sys_Txs_TrxStatus_I TXN_STATX 
     ON TransX.Txh_TRXSTATUS = TXN_STATX.Txs_ID_I 
    LEFT JOIN se2Fast.dbo.Cm_Opt_Tre_TrxRes_S AS TRX_RESX 
     ON TRANSX.Txh_ID = TRX_RESX.Tre_TRXHDRID 

Antwort

1

mit einem common table expression mit row_number():

;with cte as (
    select * /* cols go here*/ 
    , rn = row_number() over (
     partition by CONT.POH_ID 
     order by TRANS.txh_effectivedate desc 
     ) 
    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 
     -- GETS THE LAST TRANSACTION 
     LEFT JOIN se2Fast.DBO.CM_OPT_TXH_TRXHDR_S TRANS 
      ON TRANS.TXH_POLICYHDRID = CONT.POH_ID 
      --AND TRANS.txh_effectivedate < (
      --SELECT MAX(TRAN1.txh_effectivedate) 
      --FROM se2Fast.DBO.CM_OPT_TXH_TRXHDR_S TRAN1 
      --WHERE TRAN1.TXH_POLICYHDRID = CONT.POH_ID) 
     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 
     LEFT JOIN se2Fast.dbo.Cm_Sys_Txs_TrxStatus_I TXN_STAT 
      ON Trans.Txh_TRXSTATUS = TXN_STAT.Txs_ID_I 
) 
select * 
from cte 
where rn < 3 
/* last and second to last will have 
    rn of 1 and 2 respectively  */ 

für nebeneinander:

select cte.*, cte2.* 
from cte 
    inner join cte as cte2 
    on cte.POH_ID = cte2.POH_ID 
     and cte.rn = 1 
     and cte2.rn = 2 
+0

Ich glaube nicht, dass seine die Ergebnisse den Weg zu geben ich will. Ich möchte sie nebeneinander statt in einer Spalte. Transaktionsdatum1, TransaktionsStatus1, Transaktionsdatum2, TransaktionsStatus2. Verstehen? – ChrisM

+0

@ChrisM Sie könnten einen Self-Join der Cte dafür verwenden, ich habe meine Antwort aktualisiert. – SqlZim

+0

Seltsam. "Konvertierungsfehler beim Konvertieren des Varchar-Werts rn in den Datentyp int." – ChrisM

Verwandte Themen