• I don't see how you can force the order without using an ordering column of some kind so it seems the easiest solution is to just add an IDENTITY column to the target table. Then we can query the data in the order it was entered. (You could probably also use a TIMESTAMP column, a DATETIME, or a NEWSEQUENTIALID for ordering as well...but you will need something that indicates the order of the rows since SQL doesn't necessarily store them in the order they are entered.)

    With that addition then, this query will do what you want:

    --Sample data

    IF OBJECT_ID('tempdb..#Invoice_t') IS NOT NULL

    DROP TABLE #Invoice_t

    CREATE TABLE #Invoice_t (

    [RowID] INT IDENTITY(1,1) NOT NULL,

    [Cost_Center_code] [int] NOT NULL,

    [Payment_code] [int] NOT NULL,

    [INV_No] [int] NOT NULL,

    PRIMARY KEY CLUSTERED ([RowID],[Cost_Center_code],[Payment_code],[INV_No]))

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 1, 2)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 2, 2)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 3, 2)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 4, 2)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 5, 2)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 6, 2)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 7, 2)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 8, 2)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 9, 2)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 10, 2)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 1, 1)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 1, 2)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 1, 3)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (2, 1, 1)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (2, 1, 2)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (2, 2, 1)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (2, 2, 2)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 2, 1)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (3, 2, 1)

    INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (3, 1, 1)

    SET NOCOUNT ON

    ;WITH

    cteInvoices

    AS

    (

    SELECT

    RowID

    ,RowID+1 AS PrevRowID

    ,RowID-1 AS NextRowID

    ,Cost_Center_code

    ,Payment_code

    ,INV_No

    FROM

    #Invoice_t

    )

    SELECT

    i.Cost_Center_code

    ,i.Payment_code

    ,i.INV_No

    ,p.Cost_Center_code AS [prev_cost_center_code]

    ,p.Payment_code AS [prev_payment_code]

    ,p.INV_No AS [prev_Inv_no]

    ,n.Cost_Center_code AS [next_cost_center_code]

    ,n.Payment_code AS [next_payment_code]

    ,n.INV_No AS [next_Inv_no]

    FROM

    cteInvoices AS i

    LEFT OUTER JOIN

    cteInvoices AS p

    ON i.RowID = p.PrevRowID

    LEFT OUTER JOIN

    cteInvoices AS n

    ON i.RowID = n.NextRowID

    WHERE

    i.RowID > 0