- ベストアンサー
項目値の連結...?
いつもお世話になってます。 つい先日も助けていただいたのですが、また困ったことになってしまいました。 何回も聞くのもどうかと思い、4日程悩みましたがお手上げになってしまいました。 [DATE1][DATE2][DATE3]にそれぞれ日付が入っています。 [DATE1]に日付が入っていたら'りんご'、[DATE2]に日付が入っていたら'みかん'、[DATE3]に日付が入っていたら'かき'と、1つの項目に(新しい項目?)集約して表示させたいです。 実際のデータ ------------------------ ID、DATE1、DATE2、DATE3 ------------------------ 1、2005/10/11、空、空 2、空、空、2005/10/15 3、空、2005/10/12、2005/11/1 4、空、2005/10/20、空 ------------------------ 出したいデータ ----------------- ID、新規項目 ----------------- 1、りんご 2、かき 3、みかん・かき ← 4、みかん ----------------- ID3のように集約させるのが難しくてできません。 下記のようなSQLを以前教えていただいたので、やってみましたが、[DATE2][DATE3]のようにだぶっている場合は対応できません。 select ID,case when DATE1 <> '' then 'りんご' when DATE2 <> '' then 'みかん' when DATE3 <> '' then 'かき' end as 新規項目 from TABLE1 こういう場合、どういうSQLを書けば良いでしょうか? よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ANo2さんのおっしゃるとおり 非正規系になるのが問題かと。。 ANo1をあえて少し改良するとこんな感じですかね。 検証はしてません select ID, replace( 'アタマ' + case when DATE1 is NULL then '' else '・りんご' end + case when DATE2 is NULL then '' else '・みかん' end + case when DATE3 is NULL then '' else '・かき' end + ・・・ case when DATE8 is NULL then '' else '・ばなな' end , 'アタマ・','') as 新規項目 from TABLE1
その他の回答 (2)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
>てことで、べたべたでもできますが、かなりわかりにくくなりそうな予感です。 非正規なテーブルが故の業(ごう)です。 >これ以外に方法はないものでしょうか。 テーブルを設計しなおすのが、最良の方法かと思います。
お礼
そうですね。 でも、項目を分けて日付を持つという事も必要なので、私個人の見解で勝手にDBの構造を変更するわけにもいかず...。苦しいですね。 ありがとうございました。
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
項目の集約の際、間に'・'を挟むことに、難儀しているということでしょうか。 select ID, case when DATE1 is NULL then '' else 'りんご' end + case when DATE2 is NULL then '' when DATE1 is NULL then 'みかん' else '・みかん' end + case when DATE3 is NULL then '' when DATE1 is NULL and DATE2 is NULL then 'かき' else '・かき' end as 新規項目 from TABLE1 べたべたの判断式ですが・・・こんな感じで出来なくはないでしょう。
お礼
k_o_r_o_c_h_a_nさん、ありがとうございます。 できました! が...、実はDATE項目はあと5つあり、全部で8つになります。もしかしたらさらに増えるかもしれません。 てことで、べたべたでもできますが、かなりわかりにくくなりそうな予感です。 これ以外に方法はないものでしょうか。
お礼
7marineさん、ありがとうございます。 k_o_r_o_c_h_a_nさんのコードに少し手を加えただけで、かなり分かりやすくなるんですね。 どうも、ありがとうございます。 お二人のコードを参考にさせていただいて、無事完成できました。 本当にありがとうございました!