トップページ⇒tech
1001コメント392KB

SQL教えて〜!!

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
データーベースのテストが水曜日にあります。
全くのチンプンカンプンで問題の意味すらわかりません・・
門題は「単価が30000円以上で40000円以下の商品名と単価を
表示する命令」です!!これをSQL文にして欲しいのですが・・
0702デフォルトの名無しさんNGNG
>>698
select 区分, 名前, 値 from 表 where 区分 = 'B'
group by 区分 having min(値) = 値
0703デフォルトの名無しさんNGNG
>>698
select 区分, 名前, 値 from 表 where 人 = 'B'
group by 区分 having min(値) = 値
0704デフォルトの名無しさんNGNG
>>699 「改訂新版 はじめてのSQL」技術評論社 なんかどうだ?
0705698NGNG
>>701-703
ありがとう。でも出来なかったです。
ループ内なのでSQLでなんとかしたかったですが
とりあえずプログラム処理でやっちゃいます。
0706デフォルトの名無しさんNGNG
>>705
select
a.人, a.区分, b.名前, a.値
from
(select 人, 区分, min(値) 値 from 表 group by 人, 区分) a,
表 b
where
a.人 = 'B' and
b.人(+) = a.人 and b.区分(+) = a.区分 and b.値(+) = a.値
0707698NGNG
出来ました♪ >>706さんどうもです!
でも速度はプログラム処理の方(意外と速かった)とほとんど変わらなかった・・・
まあ勉強になったので良しですね。
ちなみに人 = 'B' の条件を副問い合わせ部分に入れたりしてみました。
0708706NGNG
>>707
人、区分でグループ化した時、一つのグループのレコード数がかなり多くなる
ような場合じゃないと大して効果は無いかも。

あと、このケースの人 = 'B'はどの階層の副問い合わせに書いてもパフォーマンスは
変わらなかったりする。どこに書いてもインデックスが切ってあれば使ってくれるし。
オプティマイザって案外賢いんです。
0709 NGNG
where A or B という検索条件の場合、
C言語の if 文のように、最初の A が合致したら B の判定はパスされますか?
つまり、合致する率の高い方から記述した方が効率は上がるのでしょうか?
0710デフォルトの名無しさんNGNG
例えば、こんなデータがあったとします。

 テーブル名:TABLE_AAAA

 分類A 分類B 値
 ----------------
  001  0001  aa
  001  0002  bb
  001  0003  cc
  002  0001  dd
  002  0002  ee
  002  0003  ff
  003  0001  gg
  003  0002  hh

この分類Aと分類Bのコードの関係は親子関係になっています。

このデータから、3レコード目のcc〜7レコード目のggまでを取ってくるSELECT文はどのように書けば
良いのでしょうか?
0711デフォルトの名無しさんNGNG
>>710
普通は、このような用途がある場合、分類Aと分類Bを分けずに1つにするのではないでしょうか。

select 値 from テーブル where 分類AB between 0010003 and 0030001;

もっとテーブル設計の勉強をして下さいお願いします。vvv

0712710NGNG
ありがとう御座いました!!
さよなら
0713デフォルトの名無しさんNGNG
Oracleだと
SELECT
値, to_number(分類B*10000) + to_number(分類A) x
FROM TABLE_AAAA
WHERE x >= 001003 AND x <= 0030001

かな?
それからこのテーブルの主キー条件が不明瞭だが、
分類A+分類Bで主キーという事でいいかい?
0714仕様書無しさんNGNG
>>712
2chでわざわざ"さよなら"言う奴はめずらしいな。
0715713NGNG
>>711
WHERE句でbetweenを使うとパフォーマンスが落ちます。
もっとチューニングの勉強をしましょう。
0716710NGNG
>>713
おっしゃるとおり、分類A+分類Bが主キーです。
できました、ありがとう御座いました。


0717デフォルトの名無しさんNGNG
>715
Oracleの場合、betweenはオプティマイザが
x >= 001003 AND x <= 0030001
に変換する、とマニュアルで読んだ覚えがあるけど。
0718713NGNG
だから変換する時間だけパフォーマンスが落ちるだろ。
ストアドプロシージャにすると.......う、俺もよく分かってない。シッタカ君だったのか(萎え)
0719デフォルトの名無しさんNGNG
>718
> だから変換する時間だけパフォーマンスが落ちるだろ。
それはそうだろう。だけどそんなのチューニングを語る上ではまあ微々たるものだと思うよ。
よほどオプティマイザの性能が低いってんならともかく。
0720あNGNG
初歩的な質問なんですが、宣言でchar(4)やnumber(4)とすると4バイトまで
宣言できますが,もしchar,numberのようにバイトを指定しなかったとしたら
何バイトまで使えるのですか?
0721デフォルトの名無しさんNGNG
SQL Server 2000 のロールアップ集計について質問です。
商品分類ごとに小計を出したい、ただし商品分類に属している商品名称が
ひとつの時は小計を表示しない(つまり明細が複数あるときだけ小計を出す)。
以下のような問い合わせを書きました。

Select 商品分類, 商品名称, 売上金額
From 売上データ
Group By 商品分類, 商品名称 With Rollup
Having Not (Grouping(商品名称) = 1 And Count(*) = 1)

これでうまくいったのですが、商品名称を商品コードにすると
小計が表示されませんでした。列の型が関係あるのでしょうか?
商品コードにすると With Rollup で生成された行に対する Count(*) が
常に 1 になっているようです。BooksOnlineを見ましたが、
Count(*) がどのような値を返すかは、記述してありませんでした。

どなたか分かる方いませんか?
0722デフォルトの名無しさんNGNG
>>720
そもそも、number(4)って 4バイトって意味なのか?
0723デフォルトの名無しさんNGNG
>>720
それぞれのDB環境によって違うでしょう。
マニュアルで確認しよう。
0724デフォルトの名無しさんNGNG
あくまでも、予想なのだが
varcharと同じと考えるとそうかもね
ただ、number(4)だから
0から9999までの10進数しか扱えないと思われる
あくまでもいい加減な答えをしてみるテスト
0725デフォルトの名無しさんNGNG
>>720
oracleなら
charはchar(1)といっしょ
numberは小数点とかの位置、桁数がわからないとき
とかに使うんじゃなかったっけ。
ストアドの宣言ならテーブルの型使っとけ。
0726デフォルトの名無しさんNGNG
>>720
オラクルで、numberはnumber(38)のはず
バージョンによっては、違うのかもしれないが
0727デフォルトの名無しさんNGNG
>726
精度・位取りを省略すると浮動小数点数扱いになるよ。
最大精度は確かに38桁だけどnumber(38)とは全く意味が異なるので注意。
0728726NGNG
>>727

嘘を言ってしまったようで申し訳ない。
なので、早速実験してみた。
R8.1.7 FOR WINODWS (OTN TRIAL版)

CREATE TABLE nichan(
FIELD1 NUMBER
);

SELECT TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_SCALE
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'NICHAN';

TABLE_NAME COLUMN_NAME DATA_TYPE DATA_LENGTH DATA_SCALE
------------- ---------------- --------------- ----------- ----------
NICHAN FIELD1 NUMBER 22

って、ここでつまってしまった・・・・・
テーブルの定義情報が書かれたディクショナリーって、
ほかに何かあったけか?

DATA_LENGTHはバイト数のような気がするので、
そこら辺の事を調べたらわかるのかもしれないが・・・・
領域計算の資料探せばわかるかな?
0729デフォルトの名無しさんNGNG
SQLの GROUP BY節 で筆問があります。
テーブルが1つに対してのGROUP BY節は出来るのですが、テーブルが2つになると
うまくできません。

どなたか分かる方いませんか?
0730デフォルトの名無しさんNGNG
>>729
・具体的なテーブルの構造
・最終的に欲しいデータ形式
・いま自分が書いているSQL
の3点を晒せ

俺もSQL勉強中だから一緒に悩んでやる(w
0731デフォルトの名無しさんNGNG
>>729
あとエラーメッセージを書け

どっちのテーブルの項目をGROUPしてるんだ
って単純な事だと思うが
0732729NGNG
テーブルを書きます。
TABLE ->受注
受注_支店番号|受注_部品番号|価格|リード・タイム|受注数
-------------------------------
51 |124 |25 |5 |400
51 | 125 | 0.55 | 5 | 0
51 |134 | 0.4 | 5 |500
51 |135 | 0.39 | 5 |1000
51 | 221 | 0.3 | 10 | 10000
51 | 231 | 0.1 | 10 | 5000
52 | 105 | 7.5 | 10 | 200
52 | 205 | 0.15 | 20 | 0
52 | 206 | 0.15 | 20 | 0
53 | 124 | 1.35 | 3 | 500
53 | 125 | 0.58 | 3 | 200
53 | 135 | 0.42 | 3 | 1000
53 | 222 | 0.25 | 15 | 10000
53 | 232 | | 15 | 0
53 | 241 | 0.08 | 15 | 6000
53 | 134 | 0.38 | 3 | 200

TABLE -> 支店
支店_支店番号 | 支店名 | 所在地 | 支店コード
---------------+----------------+---------------------------
51 | DEFECTO PARTS | 16 JUSTAMERE LANE, TACOMA WA | 20
52 | VESUVIUS INC. | 512 ANCIENT BLVD., POMPEII NY | 20
53 | ATLANTIS CO. | 8 OCEAN AVE., WASHINGTON DC | 10
54 | TITANIC PARTS | 32 SINKING STREET, ATLANTIC CITY NJ | 30
57 | EAGLE HARDWARE | 64 TRANQUILITY PLACE, APOLLO MN | 30
61 | SKYLAB PARTS | 128 ORBIT BLVD., SYDNEY AUSTRALIA | 10
64 | KNIGHT LTD. | 256 ARTHUR COURT, CAMELOT ENGLAND | 20

2つのテーブルを使って支店_支店番号を受注_支店番号に変えてそれをGROUP BY節
にする事です。

SELECT 受注_支店番号,支店名,所在地 FROM 受注,支店 GROUP BY 受注_支店番号;

以下のエラーが出ます。
ERROR:
Attribute 支店.支店名 must be GROUPed or used in an aggregate function

どなたか分かる方いませんか?
0733730NGNG
>>732
すまんが、何が言いたいのかよくわからん。
いま書いているSQL文を見る限り

select 支店_支店番号,支店名,所在地 from 支店

というSQL文と732の書いているSQL文は何も違わないきがする
テーブルを書いたのと同じように、最終的に欲しいデータを
(言葉でなく)データで書いてくれるのなら、もうちょい考えてみるぞ。

ひょっとして、受注のあった支店番号/支店名/所在地が欲しいのならば

select 支店_支店番号,支店名,所在地
from 支店
where 支店_支店番号 in (select distinct 受注_支店番号 from 受注)

で、出来るはずだが・・・・
むりやりgroup byを使うならば副問い合わせ部分を
select 受注_支店番号 from 受注 group by 受注_支店番号
にすればOKかな
0734デフォルトの名無しさんNGNG
>>732
むりやりやるなら>>731の例や
1.SELECT 受注_支店番号,min(支店名),min(所在地) FROM 受注,支店 GROUP BY 受注_支店番号;
2.SELECT 受注_支店番号,支店名,所在地 FROM 受注,支店 GROUP BY 受注_支店番号,支店名,所在地;
で出来ない訳は無い

ようは、グループ関数を使わない項目は、GROUP BYのリストに記述しなければならない

いちばん問題なのは、GROUP BYの構文を理解していないのだと思われる
0735ヤンNGNG
>734さん
あれ、1番はできますか?min(所在地)だと出ない気がするんですが・・・。
合ってたら申し訳ありません.ふと思ったもので。

>729さん
group byを使う時は表示させたいもの(selectの所)にはグループ関数か
group byで指定したもの以外は入れちゃ駄目という決まりがあるのですよ.
グループ関数というのは知っているとは思いますが,sum,max,min等の事です。
しかし裏技としてgroup by で指定したものと直接関係のあるものはmin,max
などを使うと出来るのです.理由は長くなるので書きませんが。
例えば支店番号と支店名は直接繋がりがありますよね.こういう場合はmin,maxを
使うとよいというわけです. 読みズらい文章すみません.がんばってくだせえ。
0736ヤンNGNG
質問があるのですが
m01得意先、m02製品品目というテーブルがありこれらがそれぞれの品番という列で
参照整合性でつながっている場合,m01得意先を更新或いは追加した時
m02製品品目も変更されているのですか?
0737デフォルトの名無しさんNGNG
>>736
すべてのDBでは知らないが、ふつうはされない
0738デフォルトの名無しさんNGNG
>736
最終的には、2つのテーブルを結合して1つのテーブルとして見る訳でしょ?
なら、両方が更新される必要は無いぞ。

逆に言えば、どちらも更新されなければならないなら正規化されていないという事に。
0739729NGNG
結果を以下のようにしてみたかったの!
受注_支店番号 | 支店名 | 所在地
---------------+---------------+-------------------------------
51 | DEFECTO PARTS | 16 JUSTAMERE LANE, TACOMA WA
52 | VESUVIUS INC. | 512 ANCIENT BLVD., POMPEII NY
53 | ATLANTIS CO. | 8 OCEAN AVE., WASHINGTON DC

これをGROUP BY節で。
(なぜこれをしたいと思ったのは、2つのテーブルを使ってGROUP BY節文が出来るのか? と思ったからである)

SQLは一ヶ月前からはじめたので、GROUP BYの構文をあまり理解していない部分があると思うます。(ただいま勉強中である)

今いくつかSQL文が出ているのを試してみます。
0740デフォルトの名無しさんNGNG
>>739

> 結果を以下のようにしてみたかったの!
なら、>>733 で良いと思うが ?

GROUP BY って、グループ化して各々のグループに対して処理するもん
だよ。例えば、支店毎の売上を求めるなら...

SELECT 受注_支店番号,SUM(価格 * 受注数) AS 売上 FROM 受注
 GROUP BY 受注_支店番号;

とかのように使う。(あってる ? 試してないからちと不安)
0741デフォルトの名無しさんNGNG
>>739

select 支店_支店番号 as 受注_支店番号, 支店名, 所在地 from 支店
where 支店_支店番号 in ( select 受注_支店番号 from 受注)
0742デフォルトの名無しさんNGNG
>>741
SELECT DISTINCT 受注_支店番号,支店名,所在地 FROM 受注,支店
 WHERE 受注_支店番号 = 支店_支店番号;
とかやるとやっぱり、遅いのかなぁ ?
0743デフォルトの名無しさんNGNG
select
支店_支店番号 as 受注_支店番号,
支店名,
所在地
from 支店
where
exists ( select 1 from 受注 where 受注_支店番号 = 支店_支店番号)
;
なんて書き方もあるけど、なんか余り意味の無いSQLだなぁ。
0744デフォルトの名無しさんNGNG
group byでグループ化した時、havingとwhereの違いについて教えて下さい.
having に書いてよい事とwhereに書いてよい事は違うのですか?
0745デフォルトの名無しさんNGNG
サーバー:Windows2K & SQLServer2K
クライアント:Win98 & Access2002(再配布版ADPファイル)

上記の構成でクライアントのADPファイルを立ち上げると、
NT等は直接サーバーに繋がってくれましたが、
Win98で試したところタイムアウトしてしまいます。
Win98にSQL Enterprise manegerをインストールし接続しようとしても、
タイムアウトではじかれてしまいます。
「接続」を手動で行うと接続できる為、認証等は間違っていないと思われます。

申し訳ございませんが、同様な現象があったことがある方、対処方法をご存知の方
助言を頂けないでしょうか よろしくお願いします。
0746745NGNG
自己解決しました。
OSに依存していると勘違いをしていましたが、
単に名前解決を行っていなかったのが原因でした。
お騒がせして申し訳ございませんでした。
0747デフォルトの名無しさんNGNG
自己解決時のフォローを入れるようなまともな人を久々に見た...
感動をありがとう。
0748デフォルトの名無しさんNGNG
>>744
HavingはGroupBy後の結果のrowに対して条件判断

なのでたとえば
select employCode, count(*)
from employee
group by employCode
having count(*) > 100
は成り立つが
select employCode, count(*)
from employee
where count(*)
group by employCode
は成り立たない。おけ?
0749デフォルトの名無しさんNGNG
後の例は
select employCode, count(*)
from employee
where count(*) > 100
group by employCode
だ。
スマソ
0750@NGNG
m02製品品目を品目マスタ、t03出荷を出荷マスタとし出荷実績のない製品を表示
したいのですが,
select
m02製品品目.品番,
m02製品品目.品名
from
m02製品品目
where
not exists(
select
m02製品品目.品番
from
m02製品品目,t03出荷
where
m02製品品目.品番=t03出荷.品番); だとレコードがでないのです。existsを
つかって求めたいのですが,どこが間違っているのでしょうか?
0751デフォルトの名無しさんNGNG
>>750
だーかーら、何でExistsがそんなに好きなの?
select m02製品品目.品番, m02製品品目.品名
from m02製品品目
where m02製品品目.品番 not in(
select t03出荷.品番, count(*)
from t03出荷
group by t03出荷.品番
having count(*) > 0)<--これいらねぇな
0752751NGNG
>>751
うへ間違えた
select m02製品品目.品番, m02製品品目.品名
from m02製品品目
where m02製品品目.品番 in(
select t03出荷.品番
from t03出荷
group by t03出荷.品番
having count(*) > 0)
0753デフォルトの名無しさんNGNG
>>750
not existsの中の、
m02製品品目とt03出荷のテーブルの結合意味ある?

select
a.品番,
a.品名
from
m02製品品目 a
where
not exists(
select
b.品番
from
t03出荷 b
where
a.品番=b.品番


しかしexists系は他に書き方が有るなら控えた方が良いよ。
テーブルが小さいうちは気にならないが、データが増えるとかなり遅いよ
0754@NGNG
有難う御座います。参考になりました.所でもう一つ質問なのですが
データを抽出する時などの際fromの所にはそのデータを抽出する際
(select,where,order,group by等の所に表名を書いた時)に使う表名
をすべて書くとを思っていたのですが、この考えは間違っているのでしょうか?
0755デフォルトの名無しさんNGNG
>>754
間違っている。貴方はエラーをおそれて副照会に表をつっこんだのだろうが、
せっかく主の表と副の表が結合していたところが、副の表同士の結合になってしまった。
0756名無しさん@お願いっぱい。NGNG
最大5文字の文字列が入るフィールドHOGEがあって
レコードにそれぞれ"3333"、"11111"、"222"が入っています。
これをORDER BY句でソートすると、当然

11111
222
3333

の順に並ぶのですが、これを、数値の小さい順

222
3333
11111

と並ぶようにするにはどうしたらいいんでしょうか?
0757デフォルトの名無しさんNGNG
>756

Oracle なら ORDER BY TO_NUMBER(HOGE)
Access なら ORDER BY Val(HOGE)

でいけるんちゃう?

SQL鯖は知らん。
0758名無しさん@お願いっぱい。NGNG
>>757
即レスありがとうございます
DBはローカルのParadoxテーブルです。

いま、ORACLEで試したところ、TO_NUMBER(HOGE)でうまく表示されました。
が、Paradoxではエラーになってしまいました。
0759デフォルトの名無しさんNGNG
テーブル A に "ID" というフィールドがあって、
テーブル A そのものを
この ID について降順に並び替えたものに書き換えたいのですが、
これは SQL 文の範疇でしょうか?
MySQL + PHP なのですが、実現する方法を教えて下さい。
0760デフォルトの名無しさんNGNG
>>759
一体何がしたいのだ?
表示するときにID順にしたいだけなら ORDER BY ID とかつけたらよろし。
0761デフォルトの名無しさんNGNG
>>760
降順だから
ORDER BY ID DESC
だべ

>>759
せめてSELECT文の基本構文くらい
マニュアルで調べろ
0762デフォルトの名無しさんNGNG
>>758
それやるとINDEXが使われなくなる罠無い?
0763デフォルトの名無しさんNGNG
ナムサン・ナムサン・ナムサン
0764デフォルトの名無しさんNGNG
SQLを使う仕事ってどんなものがあるのですか?
0765デフォルトの名無しさんNGNG
       |
  \       /

―     ○     ―         ^^

  /        \                   ^^
       |
                  ∧∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
                  ( ゚Д゚)っ< やっぱプログラマが一番使うんじゃねーのか
                ゚ ⊂ /\ \________
   ゚      。      。 ゚ ソ  ノ  ゚      。
⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒
⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒






0766デフォルトの名無しさんNGNG
>764
主に業務システム構築っすね。
あとデータベース保守とか。
0767デフォルトの名無しさんNGNG
>>760, >>761

>>759は Order By field Desc くらいは知ってるだろ。
それで、「降順に書き換えたい」って言ってるから降順にしたものを
もとのテーブルに格納したいんじゃねーの?

で、結論はデータを突っ込んだ順序通りに Select されるとは限らないので、
毎回 Order By field Desc しなさいってこった。
0768デフォルトの名無しさんNGNG
ディスク上での物理的な配置を降順にしたいって事だろ。
テーブル=Excelのワークシート、と思ってる人にありがちなパターンかも。
RDBではそういう概念は無意味な事は周知の通り。
0769761NGNG
>>767
なるほどね!
テーブル全体って事ね
>>760の「降順」って言葉かあるのに
昇順でやってるからおもわず

んで関係ないけど、
SQL鯖ならクラスタインデックスを作成すれば
SELECTするときに必ず昇順にはなる
「create crasterd index」スペルは間違ってるかも?
0770デフォルトの名無しさんNGNG
>>769
最近のDBだとビューにもOrder Byが記述できるんで、
Order By 付きの更新可能ビューを書いといて,
それに対して、更新・参照するという手もあるな。
0771デフォルトの名無しさんNGNG
質問させてもらいます。
Table1(Suzuki)
Date   Uriage
---------------

Table2(Sato)
Date   Uriage
---------------

今SuzukiとSatoという2つのテーブルがあります。
それぞれ日付は連続していないで個人の売上があった日のみ登録してあります。
また、双方ともDate,Uriageというフィールドを持っています。

この両者を結合させて
Date   Suzuki.Uriage   Sato.Uriage
------------------------

という結果を得たい時に発行すべきSQL文を教えてください。
両者とも売上の無い日も空欄で良いので日付を連続して結果に返してほしいのです。

よろしくお願いします。
0772デフォルトの名無しさんNGNG
>>両者とも売上の無い日も空欄で良いので日付を連続して結果に返してほしいのです。

この条件がある以上は、この情報だけでは...たぶん出来ないな
おれが技を知らないだけかも知れないが
縦方向に表示するためには、データの中に必ず無ければ出ないっと認識している
ようはカレンダーテーブル見たいのがあればOK

1ヶ月限定とかで、横に出すのは出来なくはない

TANTOU,1,2,3,4,5,6,7,8,9,10・・・・・・・
-----------------------------
Suzuki
Sato

みたいな感じで
0773デフォルトの名無しさんNGNG
>>771
そもそもそのスキーマおかしい。設計からやり直し。
そんでそのテーブル構成の結合構文では、>>771の意図している出力結果は出ない。
レポート用に日付を格納できるテーブルを作ってExcelで適当に10年分ぐらいデータ作って入れとく。

そんで次のSQL
SELECT Calendar.Date, Suzuki.Uriage, Sato.Uriage
FROM Calendar LEFT OUTER JOIN Suzuki ON Calendar.Date = Suzuki.Date
LEFT OUTER JOIN Sato NON Calendar.Date = Sato.Date
ORDER BY Calendar.Date

アバヨ
0774デフォルトの名無しさんNGNG
>>771
少なくとも使用DBくらい書けよ
0775デフォルトの名無しさんNGNG
みなさんありがとうございました。
使用DBはMSのSQLサーバです。

実は納期が一週間後なんです・・・

ところで、少なくともどちらか一方が売り上げた日を含む
レコードを作成する事はできますか?

Table1(Suzuki)
Date      Uriage
---------------
1999/12/03  30,000
1999/12/05  23,000
1999/12/23  40,000


Table2(Sato)
Date      Uriage
---------------
1999/12/01  50,000
1999/12/07  16,000
1999/12/30  20,000

だとしたら

Date      Suzuki.Uriage      Sato.Uriage
------------------------
1999/12/01  (NULL)  50,000
1999/12/03  30,000  (NULL)
1999/12/05  23,000  (NULL)
1999/12/07  (NULL)  16,000
1999/12/23  40,000  (NULL)
1999/12/30  (NULL)  20,000

このような結果を得たいのです。

0776デフォルトの名無しさんNGNG
結果は(NULL)ではなくゼロになって返ってくるとさらに嬉しいのですが・・・・

泣きたいほど追い込まれている私ですがDBって面白いですね。
一応業務系PGを2年やっててDBに触った事がないって終わってますね(涙
0777デフォルトの名無しさんNGNG
横から悪いけど

Select Suzuki.data, Suzuki.Uriage, Sato.Uriage
where Suzuki.Data = Sato.Date;

だとどういう結果が帰って来る?ほとんど素人だが採点頼む。
0778デフォルトの名無しさん     NGNG
>>777
スリーセブン、くそっ!
0779デフォルトの名無しさんNGNG
>>777
たぶんダメ


select
Date,
CASE WHEN hito = 'Suzuki' THEN ISNULL(SUM(Uriage), 0) END SuzukiUriage,
CASE WHEN hito = 'Sato' THEN ISNULL(SUM(Uriage), 0) END SatoUriage
from
(
select 'Suzuki' hito, Date, Uriage from Table1
union all
select 'Sato' hito, Date, Uriage from Table2
) a
group by Date, hito
order by Date

こんな感じだと思う
0780デフォルトの名無しさんNGNG
>>779
なんでダメ?多分エラーにはならず結果は帰ってくると思うけど
これだと何が帰ってくる?

手元にSQLないからわからん
0781デフォルトの名無しさんNGNG
>>777
FROM が無いとか、Suzuki.Data などと言うフィールドは無いと言う
レベルのエラーは別として、鈴木さんと佐藤さんが同一日に売上を
上げたレコードだけ返ってくると思う。
0782デフォルトの名無しさんNGNG
みなさんありがとうございます。
なかなか779さんのSQLは複雑ですね。。。
さっぱり解かりません。
これから徹夜で勉強します。(涙
0783デフォルトの名無しさんNGNG
>>781
ほぅ、勉強になった。サンクス
要するに鈴木さんと佐藤さんの2人とも売り上げた日のレコードしか返ってこないという事?
0784779NGNG
>>777
だいたいのことは>>781の言うとおり

外部結合にしても駆動表にない日付のは出ないから
0785デフォルトの名無しさんNGNG
>>784
そうか、また勉強になった。サンクス
俺もデータベースの勉強するかな
0786仕様書無しさんNGNG
翔泳社のDBマガジンって、いいですか?>>ALL
0787デフォルトの名無しさんNGNG
>>786
翔泳社の本で勉強したらオラクルシルバー落ちたので良くない本だと思います。
0788779NGNG
スキーマ定義的には

Hito Date Uriage
-----------------
Suzuki 1999/12/03 30,000
Suzuki 1999/12/05 23,000
Suzuki 1999/12/23 40,000
Sato 1999/12/01 50,000
Sato 1999/12/07 16,000
Sato 1999/12/30 20,000

こうあって有るのがベスト?
まずサブクエリの中で、そういう風に作り替えてる

あとは、
1カラム目に日付
2カラム目に鈴木さんの売上
3カラム目に佐藤さんの売上
ってやってるだけっす


まぁ実際SQL文を出してワカランのなら
簡単には理解できないと思われます


あっ環境が無いので確認してないから、
間違えてるかも知れないけど
遠からずは無いと思う
頑張ってください
0789デフォルトの名無しさんNGNG
>>786
使えん。Oracle、SQLサーバマガジンの間違いじゃないのって言いたくなる。
これからDBはじめる初心者にはいいかも。
0790デフォルトの名無しさんNGNG
>>775
完全外結合が使えるデータベースならこれでいいだろ。
データベースがおちんぽで完全外結合ができないってんなら、
>>779 の方法使うのもひとつの手だと思う。

Select
 IsNull(Table1.Date, Table2.Date),
 IsNull(Table1.Uriage, 0),
 IsNull(Table2.Uriage, 0)
From Table1 Full Outer Join Table2 On Table1.Date = Table2.Date
0791デフォルトの名無しさんNGNG
>>775
納期が迫っているのなら、SQL一発で抜き出すのは
ある程度のところで諦めて、何回かSQLを発行して
その結果をPG上でゴリゴリとくっつけるんだな。

パフォーマンスが悪くても、その機能が実装できないよりはいくらかましだろうて。
0792デフォルトの名無しさんNGNG
>>782
ところで徹夜で勉強してわかったのか?
0793デフォルトの名無しさんNGNG
下記の二つの「科目テーブル」と「点数テーブル」から

ある人物が最高得点を取った科目数を出したいのですが、どのようにすれば
良いか教えていただけないでしょうか?

KAMOKU
CODE KAMOKU
0001 国語
0002 数学
0003 物理
0004 史学

POINT
CODE NAME KAMOKU POINT
0001 山田 0001 95
0002 遠藤 0001 85
0003 菊地 0001 60
0004 山田 0002 60
0005 遠藤 0002 90
0006 山田 0003 59
0007 遠藤 0003 70
0008 菊地 0003 95
0009 山田 0004 75

受験科目数は

SELECT COUNT(DISTINCT NAME) FROM POINT WHERE NAME = "山田"

でできたと思うんですが


最高得点回数についてどなたかアドバイスいただけませんか?
0794デフォルトの名無しさんNGNG
>>793
質問意味不明
出力結果求む

もちろんMAXでやれば良いんじゃない?
ってだけじゃ無いよなぁ


>>SELECT COUNT(DISTINCT NAME) FROM POINT WHERE NAME = "山田"
これだと必ず1になるんちゃう? DISTINCT いらないんちゃう?
0795デフォルトの名無しさんNGNG
SELECT NAME, COUNT(*)
FROM POINT
WHERE
( KAMOKU, POINT ) IN (
SELECT KAMOKU, MAX(POINT)
FROM POINT
GROUP BY KAMOKU
)
GROUP BY NAME;

こんなかんじ?
0796デフォルトの名無しさんNGNG
>>795
これは構文エラーだべ
INは複数の項目は出来ないべ

意図としてることが合ってれば
SELECT NAME, COUNT(*)
FROM POINT p, (SELECT KAMOKU, MAX(POINT) POINT FROM POINT GROUP BY KAMOKU) a
WHERE p.KAMOKU = a.KAMOKU
AND p.POINT = a.POINT
GROUP BY NAME;

こうかな?
POINTって項目とテーブルに使われているのが気になるが
0797デフォルトの名無しさんNGNG
>>796
>>少なくともOracleは795-796両方OKだよ。
1) where exists (select ...)
2) where (col1, col2...) in (select ...)
は同じ結果を返すように作れるけど、2)の場合はサブクエリを先に評価
するようにオプティマイザを誘導できたりして、サブクエリで絞込みの大半を
行うようなケースで便利だったりする。
0798デフォルトの名無しさんNGNG
質問です。
数値型のデータにTO_CHARを使用したところ、空白が混ざってしまいます。
例: TO_CHAR(1,'00000000') → 「 00000001」
みたいな感じです。
どなたか、原因と回避方法をご存知ないでしょうか?
0799デフォルトの名無しさんNGNG
>>798
TO_CHAR(1,'FM00000000')
ヘルプないのけ?
0800デフォルトの名無しさんNGNG
--テーブルA--
-------------
NO  name
-------------
001 山田
002 山本
003 田中
-------------


--テーブルB--
-------------
NUM name2
-------------
555 よん
666 ご
777 ろく
888 なな
999 はち

-------------

を結合して

---------------------
NO  name NUM name2
---------------------
001 山田 555 よん
002 山本 666 ご
003 田中 777 ろく
      888 なな
      999 はち
---------------------

という表を作成したい場合、
どのようなSQL文を作成すればよいのかわかりません。
キーがないので何をしたいのか意味不明かも
しれませんがどなたか教えてさい。

0801デフォルトの名無しさんNGNG
>>800
結合の意味知ってる?
0802デフォルトの名無しさんNGNG
>>801
すいません、理解できてないと思います。
ただ一時的にこういうこういう表を作成したいのですが
無理なんでしょうか???
■ このスレッドは過去ログ倉庫に格納されています