0

次の状況に適した SQL を見つけようとしています。

2 つのテーブルがあるとします。

TABLE A
ID int,
TEXT varchar(200)

TABLE B
ID int,
A_NO int,
B_NO int

両方のテーブルの「ID」という名前のフィールドは、リンク テーブルに結合できます。

次の SQL:

SELECT
 A.ID,
 B.A_NO,
 B.B_NO
FROM
 A
LEFT JOIN
 B
ON A.ID = B.ID
ORDER BY A.ID, B.A_NO, B.B_NO

次の結果が得られます。

ここに画像の説明を入力

さて、問題です。求められているのは、列 B_NO に、列 A_NO の MIN 値に対して値 = 1 を設定し、同じ A_NO 値を持つ他のすべての行に対して値 = 0 を設定することです。以下の結果が期待されます。

ここに画像の説明を入力

この例では、各 B_NO 値に対して 2 つの行を見つけることができますが、2 つ以上の行がある可能性があることに注意してください。

CASE を使用してこれらの結果を再現しようとしましたが、成功しませんでした。事前に助けてくれてありがとう、ブズーキ。

4

2 に答える 2

2

CTEROW_NUMBER();を使用してこれを試してください。(デモ)

注意:デモ目的でとテーブルの結合クエリと見なしmyTました。as yoursに置き換えてください。A BmyTA LEFT JOIN B ON A.ID = B.ID

;with cte as (
  select id, a_no, b_no, 
         row_number() over(partition by id,b_no order by a_no) rn
  from myT
)
select id,a_no, case when rn=1 then b_no else 0 end b_no
from cte
order by a_no

--RESULTS FROM DEMO TABLE
|      ID | A_NO | B_NO |
-------------------------
| 1031014 |    1 |    1 |
| 1031014 |    2 |    0 |
| 1031014 |    3 |    2 |
| 1031014 |    4 |    0 |
| 1031014 |    5 |    3 |
| 1031014 |    6 |    0 |
| 1031014 |    7 |    4 |
| 1031014 |    8 |    0 |
| 1031014 |    9 |    5 |
| 1031014 |   10 |    0 |
于 2013-02-11T20:54:03.683 に答える
1

何かのようなもの

    select ID, a_no, b_no, 
           case when a_no = min_a_no then b_no else 0 end as new_b_no
    from 
           a left join b on a.id = b.id left join
           (Select ID, B_no, min(a_no) as min_a_no
            from  a left join b on a.id = b.id
            group by id, b_no) m on a.id = m.id and b.b_no = m.b_no
    ORDER BY A.ID, B.A_NO
于 2013-02-11T20:52:33.947 に答える