• 締切済み

SQL文の書き方。初歩的ですみません。

SQL文苦手で困っています。教えてください。 MSSQLserver8.0使用です。 以下のテーブル。 コードA 区分 コードB 数量 101     A    301    1 101     A    302    2 101     A    303    1 101     B    901    2 101     B    902    1 102     A    301    1 102     B    901    2 を、コードB単位に数量を集計し、区分別に左右に分け 以下のように帳票出力したいのですが。  301 A 2 |(区切り)| 901 B 4  302 A 2 |(区切り)| 902 B 1  303 A 1 group by 区分, コードBといきたいところなんですが。 使用している帳票出力ソフトの関係上、1ページ毎に出力しなければならず、 通常、A区分データが多いため、改ページのタイミングがずれます。 A区分のデータとB区分のデータをそれぞれ別に取得し(2つのSQL)、 2つの結果を交互に1行ずつよむ・・・という方法以外に、 1つのSQL文で、 1行目がA区分(301)、2行目がB区分(901)、3行目がA区分(302)・・ のように交互にデータを取得する方法ってありますか? うまく表現できなくてすみませんが、 よろしくお願いします。 

みんなの回答

回答No.2

>2つの結果を交互に1行ずつよむ・・・という方法以外に、 >1つのSQL文で、 SQLサーバでは行番号という関数が無いので、1文でのSQLでは無理です。 仮にDBがオラクルで、行番号の関数を組み合わせて実現しても、利点はありません。 「1SQL文での実現」 ではなく、 「1メソッドによるデータレコードの取得」 であれば、ストアドに処理を行わせて、データセットを取得させた方がよい気がします。 イメージとしては、IDENTITY関数を利用した一時テーブルを二つ作成し、それを連結させるような感じになると思います。

purico22
質問者

お礼

>IDENTITY関数を利用した一時テーブルを二つ作成し すみません、よく分かりません。 私には難しすぎるようです。お恥ずかしい。 結局、そんな都合のよいSQL文はないということで、 ワーク変数にセットし、行数に応じてRedim・・・ みたいな感じでまとめました。 ありがとうございます。

noname#17648
noname#17648
回答No.1

区分AとBがあるのですね。 出力帳票用のワークエリアに書き込んでいるかと思います。 AとBの各出力件数をカウントしてください。 SQLで順に読み込んだデータを処理していきますね。 処理するデータがAのとき 出力件数のカウントがA<BのときはREWRITE、それ以外ならWRITE。 書き込む位置はAの出力カウント+1行目 (REWRITEならBが書かれている既存行、WRITEなら新行) 処理するデータがBのとき 出力件数のカウントがB<AのときはREWRITE、それ以外ならWRITE。 書き込む位置はBの出力カウント+1行目 交互にデータを取得せずとも、これで、行けませんかね?

purico22
質問者

お礼

結局、そんな都合のよいSQL文はないということで、 ワーク変数にセットし、行数に応じてRedim・・・ みたいな感じでまとめました。 ありがとうございます。

purico22
質問者

補足

回答ありがとうございます。 すみません、質問の仕方がまずかったみたいです。 例えば、1ページの最大行数が10行とし、 出力すべき区分Aのデータが11行、区分Bのデータが5行あったとすると、 GROUPBYでAのデータが先行され、それだけで最大行数を超えてしまい、 ソフトの関係上、帳票の描画は1ページ単位なので、Bの欄が白紙になって出力されることになります。 で、困っているわけなんです。

関連するQ&A