電子書籍の厳選無料作品が豊富!

例えば、
[品物管理テーブル]
cd:name
01:スナック菓子
02:ジュース
03:アイス
04:ガム
 ・
99:その他

[店舗別売り上げランキング管理テーブル]
shop:no1:no2:no3
A店: 03: 01: 04
B店: 01: 02: 04
C店: 02: 01: 03
D店: 02: 01:null
があった場合に
A店の売り上げ順に[品物管理テーブル]のcdとnameを取得したい場合は
どのようにすればよいのでしょうか?
SELECT cd, name
FROM [商品管理テーブル] AS syo
LEFT JOIN [店舗別売り上げランキング管理テーブル]AS ran
ON syo.cd=ran.no1 OR syo.cd=ran.no2 OR syo.cd=ran.no3
WHERE ran.shop='A店';
とすると、ランキングを無視して[品物管理テーブル]の順で
01:スナック菓子
03:アイス
04:ガム
と返ってきてうまくいきません。

A 回答 (2件)

品物管理テーブル・・・・t1


店舗別売り上げランキング管理テーブル・・・t2
とします。

以下でどうでしょうか?

select shop,no as 店内順位,cd,name from (
select shop,1 as no,no1 as rk from t2
union all
select shop,2 as no,no2 as rk from t2
union all
select shop,3 as no,no3 as rk from t2
) as v left join t1
on v.rk = t1.cd
order by shop,no
    • good
    • 0
この回答へのお礼

連絡が遅くなり済みません。
baunceさんの回答で、うまく取得することが出来ました。
ありがとうございました。

お礼日時:2009/01/20 18:56

ここはPostgreSQLのカテゴリなのですが、使用しているRDBMSは合っていますか?


表名、列名などが予約語と一緒だったり、特殊文字を含んでいる場合でも名称として使用できるように

[テーブル1]
[カラム1]

といった囲み方をするのは、SQL ServerやMS-ACCESSなど、マイクロソフト製品の独自仕様なのですけど?
具体的なSQLを提示する上で、便宜上、囲っているだけですか?

>ランキングを無視して[品物管理テーブル]の順で

「ランキング順で返して」とSQLで指定していないのですから、返って来る順序は不定(RDBMSの内部処理や物理的な格納位置などによって、どうなるか分からないし、RDBMS側で保証もされない)です。
これは、標準SQLの規格上もそうだし、殆どのRDBMSによる実装でも同じです。

返って来る順序を保証させたいなら、「order by」で明示的に指定してください。
    • good
    • 0
この回答へのお礼

早々の回答ありがとうございました。
テーブルを[]で括っているのは、テーブルとカラムを分かりやすく分けたかっただけです。

また、ORDER BYは試しましたが、希望する戻り値ではありませんでした。

SELECT cd, name
FROM [商品管理テーブル] AS syo
LEFT JOIN [店舗別売り上げランキング管理テーブル]AS ran
ON syo.cd=ran.no1 OR syo.cd=ran.no2 OR syo.cd=ran.no3
WHERE ran.shop='A店'
ORDER BY ran.no1, ran.no2, ran.no3;

お礼日時:2009/01/08 16:33

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