C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Oracle のsql文について


(過去ログ 1 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■637 / inTopicNo.1)  Oracle のsql文について
  
□投稿者/ Miya 二等兵(1回)-(2005/06/19(Sun) 11:21:33)

分類:[VB.NET] 


分類:[VB.NET] 

はじめまして。教えてGooで、何度かお世話になりました。
VB.NET & Oracle[10g]で、プログラミングをしております。
Gooでも質問をしたのですが、回答を頂けなく困っております。

Oracl[10g]の SQL文について、教えて下さい。

[A]テーブルに [CODE] と [NAME]フィールドがあるとします。
内容は、
A-1 NAME-1
A-2 NAME-2
A-3 NAME-3 と、します。

[B]テーブルに [CODE] と [NOUKI] と [KIN] と [CODE2] フィールドがあるとします。
内容は、
A-1 2005/01/01 100 AAA
A-1 2005/01/02 200 AAA
A-2 2005/01/01 300 AAA
A-2 2005/01/10 400 DDD
A-2 2005/12/10 500 EEE と、します。

[B2]テーブルに [CODE2] と [NO] と [KIN2] フィールドがあるとします。
内容は、
AAA 1 1000
AAA 2 2000
DDD 1 4000と、します。


結果が、
A-1 NAME-1 300[B]テーブルKINの合計 3000[B2]テーブルKIN2の合計
A-2 NAME-2 1200[B]テーブルKINの合計 4000[B2]テーブルKIN2の合計

と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ?
つまり、[CODE2]のフィールドを[B2]テーブルに反映させたいのです。

SELECT A.CODE,A.NAME,SUM(B.KIN),SUM(B2.KIN2)
FROM A, B, B2
WHERE A.CODE=B.CODE AND B.CODE2=B2.CODE2
GROUP BY A.CODE,A.NAME
ORDER BY A.CODE

と、すれば、何故か
A-1 NAME-1 600 6000
A-2 NAME-2 1000 7000 と、言う結果がでます。


これは、1つのSQL文では無理なのでしょうか ?
よろしくお願い致します。


0
引用返信 編集キー/
■638 / inTopicNo.2)  Re[1]: Oracle のsql文について
□投稿者/ 夏椰 二等兵(1回)-(2005/06/20(Mon) 09:38:33)

分類:[VB.NET] 

B2テーブルの主キーは[CODE2]と[NO]の複合キーですよね?
B1テーブルの[CODE2]でB2テーブルのレコードをマッチングすると
[CODE2]が一致する[NO]の種類数分レコードがヒットします。

提示された例では[CODE2]にAAAを持つB2テーブルのレコードは
[NO]に1、2の値を持つ2レコードがヒットするので、
単純に期待値の2倍の値を拾っています。

また提示されたデータを見ていると
B1テーブルの[CODE]が同じ値で、[CODE2]の値が異なる場合の取得したいレコードは
どんなレコードなのかもMiya様の書き込みからは推測できませんでした。

まずはB1テーブルとB2テーブルをマッチングする条件を再度整理し、
提示していただけませんでしょうか?


0
引用返信 編集キー/
■641 / inTopicNo.3)  Re[2]: Oracle のsql文について
□投稿者/ Miya 二等兵(2回)-(2005/06/20(Mon) 10:40:38)

分類:[VB.NET] 

ご回答をありがとうございます。

>B2テーブルの主キーは[CODE2]と[NO]の複合キーですよね?
その通りです。

[A]テーブルは、 [CODE](key)です。
[B]テーブルは、 [CODE](key) [NOUKI](key) [KIN] (数値) [CODE2] です。
[B2]テーブルは、 [CODE2](key) [NO] (key) [KIN2] (数値)です。

>提示された例では[CODE2]にAAAを持つB2テーブルのレコードは
>[NO]に1、2の値を持つ2レコードがヒットするので、
>単純に期待値の2倍の値を拾っています。

そうですか・・・ よく理解できていませんが・・・

>また提示されたデータを見ていると
>B1テーブルの[CODE]が同じ値で、[CODE2]の値が異なる場合の取得したい
>レコードは
>どんなレコードなのかもMiya様の書き込みからは推測できませんでした。

>まずはB1テーブルとB2テーブルをマッチングする条件を再度整理し、
>提示していただけませんでしょうか?

説明がどう言えば良いのか難しいのですが・・・
[A.CODE]=[B.CODE]の条件で、[B.KIN]の集計と
[B.CODE2]=[B2.CODE2]の条件で、[B2.KIN2]の集計を
1行で取得したいのです。(B1テープルはありません)

ご理解頂けたでしょうか ?
続けてのご指導をお願い致します。



0
引用返信 編集キー/
■642 / inTopicNo.4)  Re[3]: Oracle のsql文について
□投稿者/ 夏椰 二等兵(2回)-(2005/06/20(Mon) 10:58:14)

分類:[VB.NET] 

まずはBテーブルとB2テーブルの連結部分のみ考えて見ましょう。

(提示されたものをデータ限定して引用しています)
Bテーブル
A-1 2005/01/01 100 AAA
A-1 2005/01/02 200 AAA

B2テーブル
AAA 1 1000
AAA 2 2000

をCODE2で連結すると
A-1 2005/01/01 100 AAA 1 1000
A-1 2005/01/01 100 AAA 2 2000
A-1 2005/01/02 200 AAA 1 1000
A-1 2005/01/02 200 AAA 2 2000
と抽出されるんですよ。

なぜかというと BテーブルのCODE2の値に対してB2テーブルに該当するのは2レコードですよね?
([NO]=[1,2]の2レコードあるので)
なんで、Bテーブルの値は一緒だけどB2テーブルの値が異なる行が2つ表示されるんです。

これをGROUP BYで合算すると・・・
[KIN]=[100+100+200+200]=[600]
[KIN2]=[1000+2000+1000+2000]=[6000]
となってしまうわけです。

なんで、300、3000って値がほしいのに、600、6000って値が取れるのは
BテーブルとB2テーブルの結合条件が不足しているからなんです。

よって、BテーブルとB2テーブルの結合条件をちゃんと考慮すれば
Miya様が望まれている結果が出るのではないでしょうか?

0
引用返信 編集キー/
■643 / inTopicNo.5)  Re[4]: Oracle のsql文について
□投稿者/ 間違質問に考えてしまった二等兵 二等兵(1回)-(2005/06/20(Mon) 14:06:21)

分類:[VB.NET] 

教えてGooでは、質問が間違っていたとして、質問者が質問を訂正しているのに、
なぜ、こちら側では、間違っている質問を質問掲示したままなのですか。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1461096

教えてGooでは、
「同じ質問を複数のカテゴリーに投稿することはご遠慮ください」
となっているのに、なぜ、教えてGooで断わりも無く、マルチポストをするのですか。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1455378

0
引用返信 編集キー/
■648 / inTopicNo.6)  Re[1]: Oracle のsql文について
□投稿者/ Jitta 二等兵(4回)-(2005/06/20(Mon) 22:43:22)

分類:[VB.NET] 

 Oracle10gということですから、WHERE句で結合するのではなく、JOINで結合しましょう。これの利点は、結合条件と抽出条件を分離できるところです。元のSQL文を書き直すと、次のようになります。

SELECT a.code, a.name, SUM(b.kin), SUM(b2.kin2)
 FROM a
  INNER JOIN b
   INNER JOIN b2 ON b.code2 = b2.code2
  ON a.code = b.code
 GROUP BY a.code, a.name
 ORDER BY a.code

 しかしこれ、データの主体はB表ですから、B表から取得するようにすると、わかりやすくなりますね。

SELECT a.code, a.name, SUM(b.kin), SUM(b2.kin2)
 FROM b
 INNER JOIN a ON a.code = b.code
 INNER JOIN b2 ON b2.code2 = b.code2
 GROUP BY a.code, a.name
 ORDER BY a.code


> なぜ、教えてGooで断わりも無く、マルチポストをするのですか。
 マルチ"サイト"ポストの悪評を高くするため。

 gooで回答がついたからといってこちらをうっちゃっていると、こちらでは誰も回答してくれなくなりますよ > 元質問者


0
引用返信 編集キー/
■649 / inTopicNo.7)  Re[4]: Oracle のsql文について
□投稿者/ Miya 二等兵(3回)-(2005/06/21(Tue) 09:49:27)

分類:[VB.NET] 

申し訳ございません。
こちらの質問(例題)が間違っておりました。
本当に失礼なお話なのですが、他のHPで、解決いたしました。
今後とも、宜しくお願い致します。

No642に返信(夏椰さんの記事)
> まずはBテーブルとB2テーブルの連結部分のみ考えて見ましょう。
>
> (提示されたものをデータ限定して引用しています)
> Bテーブル
> A-1 2005/01/01 100 AAA
> A-1 2005/01/02 200 AAA
>
> B2テーブル
> AAA 1 1000
> AAA 2 2000
>
> をCODE2で連結すると
> A-1 2005/01/01 100 AAA 1 1000
> A-1 2005/01/01 100 AAA 2 2000
> A-1 2005/01/02 200 AAA 1 1000
> A-1 2005/01/02 200 AAA 2 2000
> と抽出されるんですよ。
>
> なぜかというと BテーブルのCODE2の値に対してB2テーブルに該当するのは2レコードですよね?
> ([NO]=[1,2]の2レコードあるので)
> なんで、Bテーブルの値は一緒だけどB2テーブルの値が異なる行が2つ表示されるんです。
>
> これをGROUP BYで合算すると・・・
> [KIN]=[100+100+200+200]=[600]
> [KIN2]=[1000+2000+1000+2000]=[6000]
> となってしまうわけです。
>
> なんで、300、3000って値がほしいのに、600、6000って値が取れるのは
> BテーブルとB2テーブルの結合条件が不足しているからなんです。
>
> よって、BテーブルとB2テーブルの結合条件をちゃんと考慮すれば
> Miya様が望まれている結果が出るのではないでしょうか?

0
引用返信 編集キー/
■650 / inTopicNo.8)  Re[5]: Oracle のsql文について
□投稿者/ Miya 二等兵(4回)-(2005/06/21(Tue) 09:51:25)

分類:[VB.NET] 

申し訳ございません。今後、十分に注意致します。
今後とも、宜しくお願い致します。


No643に返信(間違質問に考えてしまった二等兵さんの記事)
> 教えてGooでは、質問が間違っていたとして、質問者が質問を訂正しているのに、
> なぜ、こちら側では、間違っている質問を質問掲示したままなのですか。
> http://oshiete1.goo.ne.jp/kotaeru.php3?q=1461096
>
> 教えてGooでは、
> 「同じ質問を複数のカテゴリーに投稿することはご遠慮ください」
> となっているのに、なぜ、教えてGooで断わりも無く、マルチポストをするのですか。
> http://oshiete1.goo.ne.jp/kotaeru.php3?q=1455378

0
引用返信 編集キー/
■651 / inTopicNo.9)  Re[2]: Oracle のsql文について
□投稿者/ Miya 一等兵(5回)-(2005/06/21(Tue) 09:52:51)

分類:[VB.NET] 

ご回答をありがとうございました。
>gooで回答がついたからといってこちらをうっちゃっていると、
>こちらでは誰も回答してくれなくなりますよ > 元質問者

本当に、反省しております。今後、十分に注意いたします。
今後とも、宜しくお願い致します。


No648に返信(Jittaさんの記事)
>  Oracle10gということですから、WHERE句で結合するのではなく、JOINで結合しましょう。これの利点は、結合条件と抽出条件を分離できるところです。元のSQL文を書き直すと、次のようになります。
>
> SELECT a.code, a.name, SUM(b.kin), SUM(b2.kin2)
>  FROM a
>   INNER JOIN b
>    INNER JOIN b2 ON b.code2 = b2.code2
>   ON a.code = b.code
>  GROUP BY a.code, a.name
>  ORDER BY a.code
>
>  しかしこれ、データの主体はB表ですから、B表から取得するようにすると、わかりやすくなりますね。
>
> SELECT a.code, a.name, SUM(b.kin), SUM(b2.kin2)
>  FROM b
>  INNER JOIN a ON a.code = b.code
>  INNER JOIN b2 ON b2.code2 = b.code2
>  GROUP BY a.code, a.name
>  ORDER BY a.code
>
>
> > なぜ、教えてGooで断わりも無く、マルチポストをするのですか。
>  マルチ"サイト"ポストの悪評を高くするため。
>
>  gooで回答がついたからといってこちらをうっちゃっていると、こちらでは誰も回答してくれなくなりますよ > 元質問者
>

0
引用返信 編集キー/
■652 / inTopicNo.10)  Re[3]: Oracle のsql文について
□投稿者/ Miya 一等兵(6回)-(2005/06/21(Tue) 09:55:31)

分類:[VB.NET] 

皆様、ありがとうございました。結果マルチポストになってしまった事を
心から反省しております。今後、十分に注意いたしますので、宜しく
お願い致します。


解決済み
引用返信 編集キー/
■653 / inTopicNo.11)  Re[4]: Oracle のsql文について
□投稿者/ じゃんぬ 神(83回)-(2005/06/21(Tue) 10:06:27)
じゃんぬ さんの Web サイト

分類:[VB.NET] 

No652に返信(Miyaさんの記事)
> 皆様、ありがとうございました。結果マルチポストになってしまった事を心から反省しております。

それは最初に断っておけば、たいてい問題にはなりませんが、
ただ、間違ったままの質問で「意味」はあったのでしょうか?
おそらく、質問者であるあなた自身が 1 番無意味になってしまったのではないでしょうか?

> 今後、十分に注意いたしますので、宜しくお願い致します。

そうですね、今後注意していけば良いと思います。
誰にでも失敗はあります、大切なのはそれを繰り返さないことですね。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -