一応 Oracle をベースとしてのお話です。
一番の大原則は、group by で指定された列のみが select で そのまま記述できるというところです。
テーブルは通常正規化されていますから、コードに対する名称は別テーブルある事になります。
ですから、結合して名称を取り出して、その結果を:結合したキーで group by に指定した場合、
キーと名称は一対一ですが、SQL からすれば select に指定できるのは キーのほうだけです。
この場合、どうしてもその場で名称が欲しい場合は max 関数を使いますが、全体としての解決策
はいくつかあります。しかし、とりあえずこの大原則を中心に考えます。
そもそも。
select 表示データリストfrom テーブル名 と group by グループ列 と order by は、データを
処理するプロセスが違います。元のデータに直接アクセスするのが from テーブル where 条件
で、group by グループ列 having 条件は、加工処理です。order by は全ての処理が終わった後の
単純なソート処理です。
select 表示データリスト は、出力フォーマットと考えれば良いでしょう。
そう考えた場合、グループ列( 複数もあります ) を中心に加工された出力結果が仮想的なテーブル
として提供されるのが group by の結果です。グループ列 以外はグループ関数を通して出力する
ように仕様で決められていますし、それ以外の方法は矛盾が生じます( 特例とか無いので )
とまあ、理屈をこねるより group by のやってる事を自分でかわりにやってみれば解る事で、
コントロールプレイクで集計して最大値や最小値や平均やら求めるアルゴリズムは標準化できても、
はたしてただ表示したいが為に、対象となるキーにデータを付加するのは・・・
実際は、そのデータの為に保存エリアを用意する事になりますが、その時だけの都合的処理で、
仕様としての必然性に欠けますよね。
でまあ、この話はこれくらいで。
もう一つ原則的というか、騙されやすい仕様というか、グループ関数と NULL の関係です。
これは、間違いやすい落とし穴で、 NULL 同士の演算が NULL になるという SQL の原則に
のっとった上での グループ関数の挙動ですが、全て「その行は無視」が原則です。
例外は count( * ) で NULL を含む全ての行。 count( 列名 ) は NULL を除く行数。
count( distinct 列名 ) は、列名が重複しない数( つまり種類の取得 )
その他も NULL の行は無視されますが、以下は注意です。
sum( 給与 + 手当 )
給与はともかく、手当は NULL を含むという場合が想定される場合、給与 NULL は 基本給
ですから、その値が NULL という事は理由があって計算に入れる必要が無いのは矛盾しませんが、
手当が NULL の場合、給与+手当が NULL になって、計算が除外されてしまいます。
ですから、以下のように書く必要があります。
sum( 給与 + nvl( 手当,0 ) )
ですが、現実的には結局給与にも nvl しておいたほうが痛い目を見なくて済むと思います。
|
2009年06月30日
グループ関数の原則
グループ関数の原則
2009年06月29日
VB.net:印刷処理
VB.NET ベースでかなりベタで印字処理するのに、何段階かに分けてまとめているのですが、
とりあえず、単純行印字まではできました。この次はヘッダ部分の印字や合計処理といった
ブレークや集計やら印字抑制やら・・・・
まずまとめるのは無理でしょうね。
VB.NET : 印刷(1)
VB.NET : 印刷(2)
VB.NET : 印刷(3)
■ PrintPreviewDialog のツールバーの変更
■ 設計書としての印刷フォーマットのサンプル
■ コントロールブレイクのセオリー
魔人の休息
何と戦ったのか解らないですが、相当疲れてる様子です。 ひょっとしてこれは「スーツ」で、中に誰かが入ってるのかもしれません 現実の不景気もそろそろ不気味な展開が現われそうですね。 そんな気持ちも少し混じってるのかもしれません。
2009年06月28日
ExecuteGlobalを使用して文字列内の定義文を有効にして、httpで取得した関数ライブラリを使う
ExecuteGlobal は、ほとんど反則のようなステートメントですが、運用して3年近くなるのでVBScript : MDB作成 / http 経由で関数ライブラリを読み込む
もっと WEB で使えばと思うのです。これ使うと、ASP で、他ドメインにある関数定義使えたり
しますし、なんと言ってもメンテするのに一箇所でいいのが最高です。
ASP : 別ドメインにある関数ライブラリを使用して Mdb を作成する
スクリプトタグで外部参照できる wsf( WSH ) や HTA では、普通に src 属性で読み込めばいいのですが、
以下のルールを守って作っておくと、ASP で使えるだけでなく、ローカルで動的に変更してから関数化できます。
REM ********************************************************** REM ■ 動的にローディングする為の注意 REM 1) UTF-8N で保存する REM 2) コメントは REM を使用する REM 3) 条件式として = を使わない REM ■ 問題回避の対策 REM .htaccess REM AddType "text/plain" .vbs REM **********************************************************
2009年06月26日
Form(サーバー送信)汎用スケルトン(4)
バージョン4になりましたが、今回で MVC の一部としての画面部分を view.php で
切り離しています。機能的な主軸は、「ファイルアップロード」ですが、2会話による入力
コントロールも行っています
Form(サーバー送信)汎用スケルトン(4) : ファイルアップロード
Form(サーバー送信)汎用スケルトン : BASIC
Form(サーバー送信)汎用スケルトン(2) : HTTP通信
Form(サーバー送信)汎用スケルトン(3) : クッキー
2009年06月25日
Oracleエクスポートユーティリティ(expdp)パラメータ入力支援HTMLアプリケーション
単純にコマンドラインやバッチファイルでは運用時に間違いやすいので、
コマンドラインを作って実行するだけの HTML アプリケーションですが、
運用ツールとしてあると無いとでは大違いですし、自分でいくらでも作れます。
さらに、この後のインポートのバリエーションは、
こういう定型の画面が無いといろいろ問題が多いのです。
↓こんな画面
ユーザ | |
パスワード | |
サーバー | |
ディリクトリオブジェクト | |
ダンプファイル | |
スキーマ |
インポートには、大きく分けても、エクスポートしたスキーマにテーブル単位で戻す開発パターンと、
別々のサーバにデータのみ移す移動パターンと、丸ごと元へ戻すリストアパターンがあるのですが、
結局 impdp のパラメータが微妙に違うだけだったりします。
ですから、画面は必要です。
Oracle : 同一スキーマテーブルインポート
Oracle : 別スキーマテーブルデータインポート
Oracle : 別スキーマテーブル置き換えインポート
■ 関連する記事
Oracle : ディレクトリオブジェクト
2009年06月24日
女性に見えてくるから不思議ですね
マンガの凄さというか・・・
元はドクロのはずなのに、口は裂けて大きいのに、
なんか魅力的なキャラになりそうな予感。
ほんと、最初描き始めた時の頭の中は水晶ドクロしか無かったんですけどね。
口描いてるあたりからなんか、妙〜な具合になってきて、
「あれ? これってアリやん」
みたいな。
さすがに体描く自信無かったのでやめましたけど(^^;
2009年06月12日
IEのツールメニューにアドオンとして追加する実行形式
IEのツールメニューにアドオンする
実際は、実行できる種類には3種類あって、レジストリのエントリとしては、
Exec : 実行ファイル
Script : IE拡張メニューで実行できるスクリプト( なので、サンプルは .htm で中は VBScript )
ClsidExtension : C++ で書かれた dll
があります。
基本、IE拡張メニューと同じですが、マウスカーソル下のオブジェクトには
ツールメニューなのでアクセスできません。( ページ全体に対する処理になります )
PHP5で使うクラスの基本的な機能をまとめたサンプルコード
PHP + クラス
べつに凝る必要は無いですが、PHP4 の時以来まじめに作った事なかったので、
ざっと機能的な内容をよんで、もっともよさげなサンプルにしました。
PHP : クラスのサンプル
その他、プログラマがチェックしておくべきは、オーバーロードとマジックメソッドですね。
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。 Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。 また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。 ※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです 対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。 ※ エキスパートモードで表示しています アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります<% if:page_name eq 'archive' -%> アーカイブページでのみ表示される内容 <% /if %> <% if:page_name eq 'category' -%> カテゴリページでのみ表示される内容 <% /if %> <% if:page_name eq 'tag' -%> タグページでのみ表示される内容 <% /if %>この記述は、以下の場所で使用します
|