dポイントプレゼントキャンペーン実施中!

以下のテーブルのレコードをもとに

A B C
1| あ | あ | 1 |
2| あ | い | 1 |
3| あ | う | 1 |
4| う | あ | 1 |
5| え | あ | 1 |
6| あ | あ | 2 |
7| あ | い | 2 |
8| あ | う | 2 |
9| う | あ | 2 |

以下のテーブルを作成したいと考えています。

A B C D E
1| あ | あ | 1 | あ | - |
2| あ | い | 1 | い | - |
3| あ | う | 1 | う | あ |
4| え | あ | 1 | - | え |
5| あ | あ | 2 | あ | - |
6| あ | い | 2 | い | - |
7| あ | う | 2 | う | あ |

(1)カラムCを1つのグループとします。
(2)その中でカラムAの値が「あ」の場合は、カラムBの値をカラムDに設定する。
(3)カラムAの値が「あ」ではない場合は、カラムBの値をカラムEに設定する。
(4)カラムAの値とカラムBの値を入替えると同じ場合は(例では上の表の3と4、8と9のレコード)、
カラムAの値が「あ」でない方のレコード(4と9のレコード)のカラムBの値をカラムEに設定する。
(5)(4)で値を設定した方のレコードを削除する。


どのようなSQLを作成すればできるのでしょうか?

SQLに詳しい方がいらっしゃれば、ご教授をお願います

A 回答 (1件)

結果に


>4| え | あ | 1 | - | え |
とありますが、ここって
4| え | あ | 1 | - | あ |
になりますよね?

なにも考えずに書いたので、もっときれいな書き方があると思いますが、
SELECT
  A
 , B
 , C
 , CASE
    WHEN A = 'あ' THEN B
    ELSE '-'
  END D
 , CASE
    WHEN A <> 'あ' THEN B
    ELSE NVL(
      (
        SELECT
          B
        FROM
          T T3
        WHERE
          T3.A <> T1.A
        AND T3.B <> T1.B
        AND T3.A = T1.B
        AND T3.B = T1.A
        AND T3.C = T1.C
      )
      , '-')
  END E
FROM
  T T1
WHERE
  NOT EXISTS (
    SELECT
      *
    FROM
      T T3
    WHERE
      T1.A <> 'あ'
    AND T3.A = T1.B
    AND T3.B = T1.A
  )
ORDER BY
  C
 , A
 , B;

とりあえず、書いてあることだけは満たす結果になると思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!