- PR -

Oracle SQL に関して

投稿者投稿内容
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-09-07 00:18
ども、ほむらです。
-----------
hiro氏へ
引用:

>Ru.Fさんへ

具体的なSQLを教えていただけると嬉しいです。


僕の作ったSQLを改良すればできます。
きくだけじゃなくて自分のやっていることを
示していくようでなければ誰も答えてはくれなくなりますよ。
全然わからなくても作ろうとしたけどわからない部分を聞いてみるとか。。。
もちろん、下調べは必要ですけどね^^;;

ところでhiroさんは、PIVOTテーブル(クロス集計)作りたいと思っているのでしょうか?
oracleだと無理みたいですね。
横に並べるのではなくて縦にして処理できる方法を考えた方が早いような気がします。

ちなみに、
昔僕が大量のレコードを一つにまとめたときは主キーだけのレコードをINSERTして
該当する部分(フィールド)をUPDATEするという方法をとりました。
たるたる
会議室デビュー日: 2003/09/29
投稿数: 16
投稿日時: 2004-09-07 09:25
コード:
SELECT EMPCD 
     , MIN(DECODE(ROLECD, 12, '12', 'null')) AS ROLECD1 
     , MIN(DECODE(ROLECD, 17, '17', 'null')) AS ROLECD2 
  FROM TBL
 GROUP BY EMPCD

MAX関数でなくMIN関数でした。誤解を与えてすみません。
責任をとりましてこんな感じです。
ただ、上記SQLで意味が分からない場合は、使用に注意してください。
hiroさんの思っている仕様にあっているかは、判断できませんので。
Qoo
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 121
投稿日時: 2004-09-07 10:11
こんにちは。

以下のようにも記述できたはず。。。
(一部ですみません。しかも試してないので。。。)

SELECT A.EMPCD AS EMPCD, B.ROLECD AS ROLECD1
FROM ( SELECT EMPCD FROM TBL GROUP BY EMPCD ) A,
( SELECT EMPCD, ROLECD FROM TBL WHERE ROLECD = 12 ) B
WHERE A.EMPCD = B.EMPCD (+)
Ru.F
会議室デビュー日: 2003/11/21
投稿数: 17
投稿日時: 2004-09-07 10:56
こんにちは、Ru.Fです。

>hiro様
 文章力がなくて申し訳ないです。
わからなかった点を御指摘いただけると私としても助かります。

私が考えていたのはQoo様のものと似ています。

コード:

SELECT DISTINCT -- DISTINCT 重複削除
A.EMPCD AS EMPCD,
B.ROLECD AS ROLECD1
FROM
TBL A, -- 全件テーブルA
(SELECT * FROM TBL WHERE ROLECD = 12) B -- 12で絞り込んだテーブルB
WHERE
A.EMPCD = B.EMPCD(+) -- 結合



※17については省略させていただきました。

他の皆様のレスを見て勉強になりました。
hiroさんも頑張ってください。

以上

--
Ru.F


[ メッセージ編集済み 編集者: Ru.F 編集日時 2004-09-07 10:57 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-09-07 17:48
引用:

hiroさんの書き込み (2004-09-06 21:58) より:

テーブル定義については現在の状態を維持したいと考えております。
EMPCDですが、2つ以上存在いたします。
最初に記述したデータにかんしては全データの一部を抜粋したものとなります。
何かよい案がありましたら、教えていただけますでしょうか。
宜しくお願い致します。

ROLECDの数はだいたい5〜10くらいになります。
[追加] で記述した部分に関して、試してみましたがうまくいきません。

SELECT EMPCD
, DECODE(ROLECD, 12, '12', 'null') AS ROLECD1
, DECODE(ROLECD, 17, '17', 'null') AS ROLECD2
FROM TBL GROUP BY EMPCD

上記の書き方では問題ありますでしょうか。


 RECORDCDの値は、12と17しかないのでしょうか?“一部”というのが気になります。あ、「2つ以上」と書いてあるか。その“2つ以上”を、どのように抽出したいのでしょうか。n個あるRECORDCDを、横に並べたいのでしょうか?

 Oracleの場合、列数が不定のものは抽出できません。DECODEを使うなら、何が入っているか、あらかじめ知っていなければなりません。それもおかしいですよね(増えたときはどう対応しますか?)。

 つまり、表形式では格納(取り出し?)できない、ということです。そのため、テーブル定義、データ形式を見直すか、それができないならSQLではなく、バックエンドの言語で何とかするしかありません。
hiro
会議室デビュー日: 2004/09/04
投稿数: 4
投稿日時: 2004-09-07 22:38
皆様ご回答ありがとうございます。

>ほむらさんへ

申し訳ありません。
今後は自分が行ってきたことについても詳細に説明を加えます。

PIVOTテーブルというものがどうゆうものかよく分かりませんので、なんともいえませんが。
最初に投稿致しました内容を実現できればと考えております。
5〜10個(列数は分かっている)あるRECORDCDを列にとり、 行に重複なしのEMPCDをとりたいと
考えております。
説明になっていますでしょうか?

>たるたるさんへ

確認いたしましたところ、うまくいきました。
Jittaさんが指摘されたように、列数が決まっておりますので、
この方法でよいのではないかと認識しております。
ありがとうございました。

>Qooさん、Ru.Fさんへ

確認してみます。

>Jittaさんへ

RECORDCDの値は、12と17以外にも存在いたします。
n個あるRECORDCDを、横に並べたいということになります。
列数は不定ではありません。
何が入っているかあらかじめ把握しております。
既存に存在するデータをただ並べ替えるような形式と思って頂いて結構です。
この場合は、問題ありませんでしょうか?
言葉足らずで申し訳ございません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-09-09 22:55
引用:

たるたるさんの書き込み (2004-09-07 09:25) より:
コード:
SELECT EMPCD 
     , MIN(DECODE(ROLECD, 12, '12', 'null')) AS ROLECD1 
     , MIN(DECODE(ROLECD, 17, '17', 'null')) AS ROLECD2 
  FROM TBL
 GROUP BY EMPCD



文字列の「最大値」「最小値」って、とれるんですか?!って、思ったら、Oracleは通りますね。PostgreSQLは落ちました。

スキルアップ/キャリアアップ(JOB@IT)