18か月前、私は実際のレポートアプリケーションに対して、これに似た2つのクエリを作成する必要がありました。要件は異常であり、異常なレポート環境ではありませんでしたが、それでも非常に正気で賢明でした。次に、クエリの最終製品がMS-Accessにスピンインされ、最終的なレポートと印刷が行われました。実際にプログラミングするのはとても楽しかったです。
私が最もよく知っているSQL方言であるSQLServerを使用すると、レポートは次のように作成できます。
概説されたレポートの30行のうち、20行はデータ行であり、10行はページヘッダー、列ヘッダー、またはページフッター行であることに注意してください。
- 必要な長さのvarcharに変換された各フィールドを出力する、プランIDにグループ化されたメインデータのクエリを作成します。
- 各行の出力として単一の65文字のテキスト文字列を生成するスーパークエリを(1)上に構築します
- PlanIdで(2)をグループ化するスーパークエリを
grouping(PlanId)
作成し、すべての列に空の文字列を生成するテストを実行します。これは、各PlanIdグループの後の空白行です。
- 各行に順次RowNumberを割り当てるスーパークエリover(3)を作成し、フィールド
PageNumber = floor(RowNumber / 20)
と を計算しますPageSequence = RowNumber mod 20
。
- 適切なPageSequence値を使用してヘッダー/フッター行を手動で作成し、(4)のPageNumberの個別の値にクロス結合します。
- すべて(4)および(5)を適切なOrderBy句で結合します。
- 等。
これらの手法を適用する必要があった実際のアプリケーションでは、MS-Accessレポートを作成する必要がありました。このレポートでは、ページごとに6つの数値列と1つの説明列があり、最後の数値列は以前のすべての合計である、水平方向に不足するページ数があります。数値列。レポート全体はこれらのうちの3つであり、それぞれが新しいページから始まりますが、それぞれ数値列の数が異なります。生データがSQLServerにどのように格納されているか、およびデータリンクが遅いため、レポート全体を3つの個別のクエリよりも1つのクエリとして実行する方がはるかに効率的でした。
楽しむ。
PS
他のプロジェクトの制約のため、古いスタイルのCと同様のSQLマクロ機能を使用してこのSQLを動的に作成できるという利点がありました。もちろん、誰がそのようなことを聞いたことがあるので、手巻き。あなたがそれをそのように書くことができるとき、それはほとんど構造化されているように見えます。