ドリンクバーゲン会場

MySQL stringフィールドの特定の文字を抽出する方法2012年04月09日 10時29分35秒

忘れないようにメモしておきます。
MySQLでstringの一部の場所を使って処理を行いたい場合に、
抽出したり、検索する方法です。

table
code
---------
AACDE
ABCDE
ACCCE
ADDDE

上記のデータがテーブル内のcodeに保存されています。

MySQLでコードの特定の場所の2桁がほしい場合
select substring(code,3,2) as kubun from table

kubun
---------
CD
CD
CC
DD


kubunと言う名前で2桁の値を取得できる。

重複をなくす場合
select DISTINCT substring(code,3,2) as kubun from table

kubun
---------
CD
CC
DD

データを検索する場合
select * from table where substring(code,3,2) = 'CD'

code
---------
AACDE
ABCDE

Accessで24時間以内のデータを抽出する。(DateAdd関数)2011年09月28日 17時10分40秒

Accessのクエリーで抽出条件を指定する場合に、24時間以内のデータを抽出したい場合、
クエリーに1日前の日付を設定すると抽出できますが、その都度設定しなおすのは面倒なので、
現在時刻から1日前の日付を求めその日付より大きいデータを表示するように指定します。

更新日付の抽出条件に式を指定します。
>DateAdd("d",-1,Now())

DateAdd関数を利用した方法です。
最初の引数の"d"は日を表します。
2つ目の引数の”-1”は間隔です。
3つ目の引数は日付を指定します。

上の式では現在時刻から1日引いた値をDateAdd関数で求め、
その値よりも大きい値を条件にしています。
引数の指定を変更することで、必要な条件を変更することができます。

たとえば、1時間前の時刻を求めたければ、"d"を"h"に変更すれば求まります。
Between関数と組み合わせれば、期間を指定して抽出することもできるようになります。

Accessに接続すると「クエリーが複雑すぎます」となり動かない2011年08月29日 15時52分48秒

現在C#で開発を行っています。
データの保存先にAccessを使っているのですが、
C#からAccessに接続する際に「クエリーが複雑すぎます」というエラーが出るようになりました。
ただ、単純なSELECTで抽出条件もひとつのみという状況で複雑と言われても・・・!

ネットで調べてみると、テーブルの項目が100個以上になるとダメみたいで、
修正が入り、テーブルに項目を追加してからこのエラーが出るようになったので、
ためしにAccessを元に戻し、項目を減らしたらエラーはでなくなりました。

テーブルを分割し、項目数が3桁にならないように調整しながら開発を進めています。
今回は、データが複雑になることがなく、1対多になることがないので、
一つのテーブルでと考えていましたが、どうやら無理なようです。

このような制限があるとは知りませんでした。

オラクルってよくわからん。2011年05月02日 19時55分38秒

先週から、仕事でオラクルを使っています。
接続テストを行っているのですが、なかり悩みました。
客先のオラクルがバージョン8のため、
バージョン8でテストを行わなければいけないのですが、
そもそもバージョン8はWindowsNTの時代のものです。

今の会社にはNT自体が稼働していないため(NTのCDはあります)、
当初は仮想環境で構築しようと思ったのですが、
NTの時代にはフロッピーから起動する必要があり、
起動用のフロッピーがないという状態です。

NTのCDから起動用のフロッピーは作成できるのですが、
XPから起動用プログラムを起動すると、OSのバージョンが合わないと
エラーになり、結局NTはあきらめWindows2000にインストールすることになりました。

Windows2000には、なんとかインストールできたのですが、
javaのランタイムでエラーが発生し、ユーティリティなどが使えない状態なのですが、
オラクル自体は動いているようで、データベースとの接続ができたので、
なんとかローカル上では、動作確認することができました。

本来の目的は、ネットワーク経由でODBC接続することなので、
もう1台Windows2000を用意し、オラクルクライアントをインストールして、
接続のチェックを行い、動作も確認しました。

ただ、実際の作業はクライアントが英語版のWindowsXPになるので、
これで接続ができないと意味がないので、XPにもオラクルクライアントをインストールし、
接続テストを行ってみました。

オラクル8.0.6は会社で用意したものなのですが、
客先からは、オラクル8.1.7Clientが渡されていたので、
XPにはそちらをインストールし、接続を確認しまいた。

こちらも接続が確認でき、VBで簡単なプログラムを作成して実行したところ、
データも読み込むことができ、無事接続テストは完了しました。

オラクルのリスナーと言うのが、当初よくわからずなかなかつながらなかったのですが、
現在はぼんやりとではありますが、リスナーの設定もわかり始めた感じです。

SQLSERVERでの平均の求め方2011年01月24日 10時31分13秒

今回は、ちょっとした小技をひとつ!
データベース上に登録されているデータの平均点を取る方法です。

学校で使うシチュエーションとしては、成績を出す場合に平均点が必要になります。
100点満点で何点かですが、個人の平均もあれば、科目の平均、クラス単位での平均など、結構頻繁に使用することになります。

今回は、SQLで直接平均値を求める方法です。

学校では、SQLServerを使っているので、SQLServerで使える方法ですが、
他のデータベースでも、同じような感じでいけると思います。

まず、平均を求めるのは、AVG関数です。
SQL上でAVG関数を指定することで平均値を算出します。

データは下記のような形で考えていきます。
採点テーブル
学籍 科目 点数
A01 国語 75
A01 数学 77
A01 英語 48
A02 国語 48
A02 数学 55
A02 英語 48

学籍がA01の平均を求める場合のSQL文を作ってみたいと思います。

SELECT AVG(点数) as 平均 from 採点テーブル where 学籍 = 'A01'

SQL文はこんな感じでいけると思うので、実行してみます。
結果は下記のとおりです。

平均
-------
64

点数はintegerになっているので、小数点以下が切り捨てられ、
64になってしまいました。
小数1位まで表示を出したいので、このままでは使えません。
なので、まず小数の表示がでるようにSQLを修正します。

SELECT AVG(CAST(点数 as decimal(3,1))) as 平均
from 採点テーブル where 学籍 = 'A01'

decimalを使って小数点以下を表示させます。

平均
-------
64.727272

DecimalでCASTした結果、小数点以下が表示されましたが、
小数1位までの表示にしたいとおもいます。
四捨五入の関数であるROUNDを追加します。

SELECT ROUND(AVG(CAST(点数 as decimal(3,1))),1) as 平均
from 採点テーブル where 学籍 = 'A01'

ROUNDで表示する小数を1位に指定して実行しました。

平均
-------
64.7

いろいろと指定をしないと思うように表示できませんが、
面倒くさい気もしますね!