5

2つのテーブルを結合しようとしていますが、奇妙な要件があります。

通常、私はその顧客のレコードがあり、コードが一致する場所に参加します

SELECT * 
    FROM DataTable d
    JOIN LookupTable l
        ON d.LookupCode = l.LookupCode
        AND d.Customer = l.Customer

ただし、私がする必要があるのは、ルックアップテーブルの3つの行を結合することです。一致するID、および別の列のソート順(Order)に基づく前後の行(存在する場合)。次に、最初に一致するレコード、次に前のルックアップレコード、次に一致したレコードの後に​​あるルックアップレコードを使用して、結果を並べ替える必要があります。

これを達成するための最良の方法について何か考えはありますか?

例:

Lookup:
Customer Code   Order
12345    A      1
12345    B      2
12345    C      3
12345    D      4
12345    E      5
22222    A      1
22222    B      2
22222    D      4
22222    E      5

Data:
Customer    Code
12345       B
12345       D
22222       B
22222       D

Result I need
Customer    Code
12345       B
12345       A
12345       C
12345       D
12345       C
12345       E
22222       B
22222       A
22222       D
22222       D
22222       B
22222       E
4

2 に答える 2

2

最も効率的でもエレガントでもありませんが、機能します。

データ設定:

CREATE TABLE LookupTable (Customer int, Code nvarchar(1), OrderCol int)
CREATE TABLE DataTable (Customer int, Code nvarchar(1))

insert LookupTable  values (12345,'A',1),(12345,'B',2),(12345,'C',3),(12345,'D',4),(12345,'E',5),(22222,'A',1),(22222,'B',2),(22222,'D',4),(22222,'E',5)
insert DataTable values (12345,'B'),(12345,'D'),(22222,'B'),(22222,'D')

select * from LookupTable 
select * from DataTable

クエリ:

;with LookupCte as (
    SELECT  *    
        ,   ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY OrderCol ASC) AS LookUpOrder
    FROM    LookupTable
)
, DataCTE as (
    SELECT  dt.Customer
        ,   dt.Code
        ,   lu.LookUpOrder
        ,   (lu.LookUpOrder - 1) AS OrderColNVe
        ,   (lu.LookUpOrder + 1) AS OrderColPVe
        ,   ROW_NUMBER() OVER (PARTITION BY dt.Customer ORDER BY dt.Code ASC) AS DataCteRowNumber
    FROM    DataTable dt
    INNER JOIN LookupCte lu
        ON lu.Customer = dt.Customer
        AND lu.Code = dt.Code

)
, UnionCTE As (

    SELECT  d.Customer
        ,   d.Code
        ,   d.DataCteRowNumber
        ,   1 AS [CustomOrder]
    FROM  DataCTE d

    UNION ALL 

    SELECT  lt.Customer
        ,   lt.Code
        ,   d.DataCteRowNumber
        ,   2 AS [CustomOrder]
    FROM    DataCTE d 
    INNER JOIN LookupCte lt on lt.Customer = d.Customer
        AND lt.LookUpOrder = d.OrderColNVe

    UNION ALL

    SELECT  lt.Customer
        ,   lt.Code
        ,   d.DataCteRowNumber
        ,   3 AS [CustomOrder]
    FROM    DataCTE d 
    INNER JOIN LookupCte lt on lt.Customer = d.Customer
        AND lt.LookUpOrder = d.OrderColPVe
)
SELECT  u.Customer
    ,   u.Code
FROM    UnionCTE u
ORDER BY u.Customer, u.DataCteRowNumber, u.CustomOrder

与える:

Customer    Code
----------- ----
12345       B
12345       A
12345       C
12345       D
12345       C
12345       E
22222       B
22222       A
22222       D
22222       D
22222       B
22222       E

(12 row(s) affected)
于 2012-04-17T17:19:13.940 に答える
0

編集:注文フィールドにギャップがある場合は、row_Number()を使用して新しい列を作成します

;with c as (
    Select d.Customer
       , d.code
       , l.order
    from Data as d
    inner join Lookup as l
    on d.customer = l.Customer
       and d.Code = l.Code
    )
    select
        c.Customer
          ,  C.Code 
    from c
    union all
    Select 
      , c.Customer
      , l.code
    from c
    inner join lookup as l
    on c.Customer = l.Customer
      and c.Order = l.Order + 1
    Select 
      , c.Customer
      , l.code
    from c
    inner join lookup as l
    on c.Customer = l.Customer
      and c.Order = l.Order - 1
于 2012-04-17T17:21:28.257 に答える