- 締切済み
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)・・ のように交互にデータを取得する方法ってありますか? うまく表現できなくてすみませんが、 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
>2つの結果を交互に1行ずつよむ・・・という方法以外に、 >1つのSQL文で、 SQLサーバでは行番号という関数が無いので、1文でのSQLでは無理です。 仮にDBがオラクルで、行番号の関数を組み合わせて実現しても、利点はありません。 「1SQL文での実現」 ではなく、 「1メソッドによるデータレコードの取得」 であれば、ストアドに処理を行わせて、データセットを取得させた方がよい気がします。 イメージとしては、IDENTITY関数を利用した一時テーブルを二つ作成し、それを連結させるような感じになると思います。
区分AとBがあるのですね。 出力帳票用のワークエリアに書き込んでいるかと思います。 AとBの各出力件数をカウントしてください。 SQLで順に読み込んだデータを処理していきますね。 処理するデータがAのとき 出力件数のカウントがA<BのときはREWRITE、それ以外ならWRITE。 書き込む位置はAの出力カウント+1行目 (REWRITEならBが書かれている既存行、WRITEなら新行) 処理するデータがBのとき 出力件数のカウントがB<AのときはREWRITE、それ以外ならWRITE。 書き込む位置はBの出力カウント+1行目 交互にデータを取得せずとも、これで、行けませんかね?
お礼
結局、そんな都合のよいSQL文はないということで、 ワーク変数にセットし、行数に応じてRedim・・・ みたいな感じでまとめました。 ありがとうございます。
補足
回答ありがとうございます。 すみません、質問の仕方がまずかったみたいです。 例えば、1ページの最大行数が10行とし、 出力すべき区分Aのデータが11行、区分Bのデータが5行あったとすると、 GROUPBYでAのデータが先行され、それだけで最大行数を超えてしまい、 ソフトの関係上、帳票の描画は1ページ単位なので、Bの欄が白紙になって出力されることになります。 で、困っているわけなんです。
お礼
>IDENTITY関数を利用した一時テーブルを二つ作成し すみません、よく分かりません。 私には難しすぎるようです。お恥ずかしい。 結局、そんな都合のよいSQL文はないということで、 ワーク変数にセットし、行数に応じてRedim・・・ みたいな感じでまとめました。 ありがとうございます。