0

私はそのようなテーブルを持っています:

ORDER_ID   CODE1   CODE2   CODE3   STATUS
1          '001'   'BIGP'  NULL    4
2          '002'   'BIGP'  NULL    1
3          '001'    NULL   NULL    6
4          '002'    NULL   'L'     1

そしてそのような2番目のテーブル:

ADDRESS_ID   ORDER_ID  TYPE   ADD_DATE       CATEGORY
1            1         'K1'   '2010-01-01'   'CLIENT'
2            1         'D1'   '2010-01-02'   'SYSTEM'
3            2         'D2'   '2010-01-02'   'SYSTEM'
4            2         'D2'   '2010-02-01'   'CLIENT'

次のようなすべての注文に対して私がしなければならないこと:

  • ステータスが(4,6)にない
  • code1 = '002'
  • (code2=nullおよびcode3=null)または(code2 in('BIGA'、'BIGP')およびcode3 = null)または(code2 =NULLおよびcode3='L')

タイプが「D2」または「K1」の単一のアドレスを選択する必要があります(D2の方が優先度が高いため、1つのK1と2番目のD2に2つのアドレスがある場合は、D2を選択する必要があります)。
タイプD2またはK1のアドレスがない場合は、その順序でカテゴリ「CLIENT」の最も古いアドレスを選択する必要があります。

これは私が作成したものです:

SELECT TOP 1000 o.order_Id
              , a.Address_Id
              , a.Zip
            --, *
FROM orders o
 address a
    ON a.order_Id = o.order_Id
WHERE
 (a.Type='D2' OR a.Type='K1')
 AND o.Status NOT IN (4, 6)
 AND code1='002'
 AND ((code2 IS NULL AND code3 IS NULL) OR (code2 IN ('BIGA', 'BIGP') AND code3 IS NULL) OR (code2 IS NULL AND code3 = 'L'))
4

2 に答える 2

3

でTOP1 / ORDER BYステートメントを使用できるため、タスクにCROSSAPPLYを使用できますderived table

SELECT TOP 1000 o.order_Id
              , a.Address_Id
              , a.Zip
            --, *
FROM orders o
CROSS APPLY
(
 select TOP 1
        a.Address_Id,
        a.Zip
   from address a
  WHERE a.order_Id = o.order_Id
  ORDER BY case a.Type 
                when 'D2' then 1 
                when 'K1' then 2 
                else 3 
            end,
        a.ADD_DATE
) a
WHERE
 o.Status NOT IN (4, 6)
 AND code1='002'
 AND ((code2 IS NULL AND code3 IS NULL) OR (code2 IN ('BIGA', 'BIGP') AND code3 IS NULL) OR (code2 IS NULL AND code3 = 'L'))

それ以外に、注文ごとのタイプが最小限のアドレスの派生テーブルに参加する場合があります。

from orders o
inner join address a
  ON a.order_Id = o.order_Id
inner join
(
  select a.order_id, a.Type,
         row_number () over (partition by a.order_id
                             order by case a.Type when 'D2' then 1 
                                                  when 'K1' then 2 
                                                  else 3 
                                       end, 
                                      a.ADD_DATE) rn
    from Address a
   group by a.order_id, a.Type
) onlyOneAddress
  on a.order_id = onlyOneAddress.order_id
 and a.type = onlyOneAddress.type
 and onlyOneAddress.rn = 1
于 2012-04-18T12:35:23.110 に答える
0

[タイプ]説明で順序を追加するだけで、優先度が高くなります

于 2012-04-18T12:00:10.187 に答える