2009年1月11日日曜日

【初SQL】8 グループ化と集約化

そろそろSQL文が長くなってくるので、sql-mysqlモードを使いはじめることにする。
これはEmacs本体の配布に同梱されていて、M-x sql-mysqlで立ち上がる。使い勝手が悪いようなら、他の選択肢を探す。


  • 8.1 グループ化

    • なんかこのあたり、構文と意味がぐちゃぐちゃ。SQLは汚ないな。

  • 8.2 集約関数

    • この本を読んでいくなかで、徐々に徐々に違和感というか居心地の悪さが増していったのだが、その理由がわかった。やはり、スキーマというかサンプルデータベースの構造に関する説明なしに、データ取得用のSQLをどんどん繰り出されても、暗闇に何かをなげたら何かがかえってくるみたいな話になってしまっているからだ。なので、ここらへんで、勝手ながらサンプルデータベースの構造の理解を進めてみる。
    • Webでいろいろ調べてみることにする。米国の金融用語についてはまったく素人なので、間違っている可能性が少からずです。ご注意ください。

      • 付録AのER図を眺める。まあ、ER図はあまり役に立たないものだ。
      • LearningSQLExample.sqlを眺める。ポイントは次のとおり。

        • department(部門)とbranch(支社)とtitle(役職)は独立した概念である。
        • employeeのtitleは列挙型ではなく、varcharである。現況を調べる必要あり。

          • 現況。

            mysql> select title from employee group by title;
            +--------------------+
            | title |
            +--------------------+
            | Head Teller |
            | Loan Manager |
            | Operations Manager |
            | President |
            | Teller |
            | Treasurer |
            | Vice President |
            +--------------------+

          • President, Vice Presidentはわかる。
          • Teller: 出納係;出納主任;窓口係;計算係; と辞書にはある。これじゃ言葉の意味として多様すぎないか?
          • Head Teller: Tellerのリーダのことだろう。
          • Treasurer: 会計[出納]係, 経理[財務]部長; と辞書にはある。しかし、会計係と財務部長じゃずいぶん違わないか???
          • Loan Manager: 融資の責任者、だろう。
          • Operations Manager: このOperationは投機取引のことなのか、業務運用のことなのか、、、
          • 役職の階層構造をみる。

            mysql> select it.title, sup.title from employee it inner join employee sup on it.superior_emp_id = sup.emp_id;
            +--------------------+--------------------+
            | title | title |
            +--------------------+--------------------+
            | Vice President | President |
            | Treasurer | President |
            | Operations Manager | Treasurer |
            | Loan Manager | Operations Manager |
            | Head Teller | Operations Manager |
            | Teller | Head Teller |
            | Teller | Head Teller |
            | Teller | Head Teller |
            | Head Teller | Operations Manager |
            | Teller | Head Teller |
            | Teller | Head Teller |
            | Head Teller | Operations Manager |
            | Teller | Head Teller |
            | Teller | Head Teller |
            | Head Teller | Operations Manager |
            | Teller | Head Teller |
            | Teller | Head Teller |
            +--------------------+--------------------+
            17 rows in set (0.00 sec)

            役職と部門の関係もみる。

            mysql> select it.title, dep.name from employee it inner join department dep on it.dept_id = dep.dept_id;
            +--------------------+----------------+
            | title | name |
            +--------------------+----------------+
            | Operations Manager | Operations |
            | Head Teller | Operations |
            | Teller | Operations |
            | Teller | Operations |
            | Teller | Operations |
            | Head Teller | Operations |
            | Teller | Operations |
            | Teller | Operations |
            | Head Teller | Operations |
            | Teller | Operations |
            | Teller | Operations |
            | Head Teller | Operations |
            | Teller | Operations |
            | Teller | Operations |
            | Loan Manager | Loans |
            | President | Administration |
            | Vice President | Administration |
            | Treasurer | Administration |
            +--------------------+----------------+
            18 rows in set (0.00 sec)

            ああ、わかった。

            President (社長)
            ->Vice President (副社長)
            -> Treasurer (財務担当役員)
            -> Operations Manager (本部長)
            -> Loan Manager (融資部長)
            -> Head Teller (出納係統括)
            -> Teller (出納係)


          ということだ。
        • product_typeのnameは列挙型ではなく、varcharである。

          mysql> select * from product_type;
          +-----------------+-------------------------------+
          | product_type_cd | name |
          +-----------------+-------------------------------+
          | ACCOUNT | Customer Accounts |
          | LOAN | Individual and Business Loans |
          | INSURANCE | Insurance Offerings |
          +-----------------+-------------------------------+
          3 rows in set (0.00 sec)

          これはまんまだな。
        • productのproduct_cdもvarchar。調べる。

          mysql> select * from product;
          +------------+-------------------------+-----------------+--------------+--------------+
          | product_cd | name | product_type_cd | date_offered | date_retired |
          +------------+-------------------------+-----------------+--------------+--------------+
          | CHK | checking account | ACCOUNT | 2000-01-01 | NULL |
          | SAV | savings account | ACCOUNT | 2000-01-01 | NULL |
          | MM | money market account | ACCOUNT | 2000-01-01 | NULL |
          | CD | certificate of deposit | ACCOUNT | 2000-01-01 | NULL |
          | MRT | home mortgage | LOAN | 2000-01-01 | NULL |
          | AUT | auto loan | LOAN | 2000-01-01 | NULL |
          | BUS | business line of credit | LOAN | 2000-01-01 | NULL |
          | SBL | small business loan | LOAN | 2000-01-01 | NULL |
          +------------+-------------------------+-----------------+--------------+--------------+
          8 rows in set (0.00 sec)

          checking account (account): 当座預金 (手形や小切手の支払いを決済するためのもの)。transactional accountの北米名。
          savings account (account): 普通預金 (自由に預入・払戻ができる預金)
          money market acccout (account): 金融市場預金 (当座預金の一種。ただし、比較的ハイリスクハイリターン。銀行は金融市場への投資運用に利用する)
          cerificate of deposit (account):譲渡性預金証書 (定期預金のひとつ。預金者がこれを金融市場で事由に譲渡できる)
          home mortgage (loan): 住宅ローン
          auto loan (loan): 自動車ローン
          business line of credit (loan): 法人クレジットカード?
          small business loan (loan): 中小企業融資
        • officerって何?

          • どうやら、business(法人)における役員のこと。

        • accountのpending_balanceって何?

          • available balance: 利用可能残高? (払戻し等、利用できる金額)
          • pending balance: 銀行が処理待ちで保持しているものも勘案した残高? (小切手などを即時処理せずに、銀行が信用調査するなど?)

        • transactionのtxn_type_cdの'DBT'と'CDT'は何?

          • 簿記の、debit(借方)、credit(貸方)のことかな?

        • transactionのfunds_avail_dateは何?

          • そのtransaction(取引)の結果として利用可能と処理された資金が実際に利用可能となる日時かな。



    • PCLのときも書いたが、なぜ、オブジェクトやエンティティの説明のときに銀行や預金を持ち出すのか? 以上の用語の説明は、グーグル、Yahoo!、Wikipediaや金融機関サイトなどをいろいろ検索しまくって、それらかの情報をつぎはぎにしてやっと構成したものだ。用語体系として、または、概念体系として、英語のサイトですらちゃんと説明できているところが簡単には見付からないということだ。例えば、図書館の貸出システムとかの方が、例としてはマシなんじゃないか?
    • さて、進める。
    • 集約関数は、groupに対して作用する。

  • 8.3 グループの生成

    • この節、翻訳がいまいち。
    • roll-up:巻き上げ式
    • ドリルダウン:データの集計レベルを1つずつ掘り下げて集計項目をさらに詳細にする操作。
    • うーん。5.1では、with rollupの結果とwith cubeの結果が同じだ。。。

  • 8.4 グループのフィルタ条件

    • 集約関数など、グループ化された後に生成される値をフィルタ条件に用いるにはhaving節を使う。


こつこつ。

0 件のコメント: