2012年10月7日日曜日

VBAのscripting.dictionaryをPHPのvar_dumpみたいに出力

'定数         値  内容
' vbEmpty     0   Empty値
' vbNull      1   Null値
' vbInteger   2   整数型
' vbLong      3   長整数型
' vbSingle    4   単精度浮動小数点数型
' vbDouble    5   倍精度浮動小数点数型
' vbCurrency  6   通貨型
' vbDate      7   日付型
' vbString    8   文字列型
' vbObject    9   オブジェクト
' vbError     10  エラー値
' vbBoolean   11  ブール型
' vbVariant   12  バリアント型(バリアント型配列にのみ使用)
' vbDataObject13  非OLEオートメーションオブジェクト
' vbDecimal   14  10進数型
' vbByte      17  バイト型
' vbArray     8192配列
Public Sub var_dump(ByVal obj As Scripting.Dictionary)
    Dim pi As Variant
    Dim strVal As String
    Static strTab As String
    strTab = strTab + vbTab
    For Each pi In obj.Keys
        If Not IsObject(obj.Item(pi)) Then
            Select Case VarType(obj.Item(pi))
                Case vbEmpty
                    strVal = "(Empty)"
                Case vbNull
                    strVal = "(NULL)"
                Case vbInteger
                    strVal = "(Interge)"
                Case vbLong
                    strVal = "(Long)"
                Case vbSingle
                    strVal = "(Single)"
                Case vbDouble
                    strVal = "(Double)"
                Case vbCurrency
                    strVal = "(Currency)"
                Case vbDate
                    strVal = "(Date)"
                Case vbString
                    strVal = "(String)"
                Case vbDecimal
                    strVal = "(Decimal)"
                Case vbByte
                    strVal = "(Byte)"
                Case vbArray
                    strVal = "(Array)"
            End Select
            Debug.Print strTab & pi & " -> " & strVal & obj.Item(pi)
        Else
            If TypeName(obj.Item(pi)) = "Dictionary" Then
                var_dump obj.Item(pi)
            Else
                Debug.Print strTab & pi & " -> " & "(object)" & TypeName(obj.Item(pi))
            End If
        End If
    Next
End Sub

2012年10月4日木曜日

CREATE TABLE SELECTの中にAUTO_INCREMENTのIDを付ける、おまけにCHARACTERをUTF8

CREATE TABLE SELECTの中にAUTO_INCREMENTのIDを付ける、おまけにCHARACTERをUTF8

create table nek_in_tdb
(
id INT PRIMARY KEY AUTO_INCREMENT
,company_code VARCHAR( 25 ) NOT NULL ←無くでも問題ない
,name_jp VARCHAR(255) NOT NULL ←無くでも問題ない
) CHARACTER SET 'utf8'
select distinct
n.company_code
,n.name_jp
from company_tdb t
inner join company_nik n
on t.search_key = n.name_jp;

2012年9月27日木曜日

今日知った、mysqlの罠、ハァ・・(ノω=;)

今日の罠(常識かも)
①mysqlのクエリーでは「○○ <> True」使わない方がいいです。NULLのものが入ってこないから。
「○○ = False or ○○ IS NULL」が正解

②「union」では勝手に一意してくれるから、そうさせたくないときは「union all」

2012年9月26日水曜日

selectした内容をシーケンス(Sequence)付きで新しいテーブルに挿入


insert into new_table (
seq
,fund_name
,rank_org
,yyyymm
,period)
SELECT
@row := @row + 1 as seq
,fund_name
,rank as rank_org
,yyyymm
,period
FROM old_table t,
(SELECT @row := 0) r
where yyyymm = '201203'
and period = '1m'
order by rank desc limit 10;

count caseで月次統計クエリー、タイトル付きでCSV出力


SELECT 'Product_ID', 'Product_Name', 'Total', 'Jan', 'Feb',... //csvのタイトルを出力
UNION
SELECT product_id,
product_name,
Count(*), //合計
Count(CASE
WHEN RIGHT(yyyymm, 2) = '01' THEN 1
END) AS 'Jan', //1月の合計
Count(CASE
WHEN RIGHT(yyyymm, 2) = '02' THEN 1
END) AS 'Feb', //2月の合計
...
...
FROM sales_table
GROUP BY product_id
into outfile 'c:\\prod_monthly.csv' FIELDS TERMINATED BY ',';//csvに出力

2012年9月21日金曜日

住所をマッピングする為に、mysqlのLEFTとINSTRで関数で住所の検索キーを生成

まずは町、区、市、郡まで切り捨て

ALTER TABLE company_nikkei ADD shi_addr_key VARCHAR( 255 ) NULL;
UPDATE company_nikkei SET shi_addr_key =
LEFT(address,CASE
WHEN INSTR(address,'町') <> 0 THEN INSTR(address,'町')
WHEN INSTR(address,'区') <> 0 THEN INSTR(address,'区')
WHEN INSTR(address,'市') <> 0 THEN INSTR(address,'市')
WHEN INSTR(address,'郡') <> 0 THEN INSTR(address,'郡')
END);

そして、もっと大雑把、都道府県

ALTER TABLE company_nikkei ADD to_addr_key VARCHAR( 255 ) NULL;
UPDATE company_nikkei SET to_addr_key = CASE WHEN INSTR(address,'東京都') <> 0 THEN '東京都'
WHEN INSTR(address,'北海道') <> 0 THEN '北海道'
WHEN INSTR(address,'大阪府') <> 0 THEN '大阪府'
WHEN INSTR(address,'京都府') <> 0 THEN '京都府'
WHEN INSTR(address,'県') <> 0 THEN LEFT(address,INSTR(address,'県'))
WHEN INSTR(address,'市') <> 0 THEN LEFT(address,INSTR(address,'市'))
ELSE '不明' END;

DBのエンコードはUTF8だけど、データ自体のエンコードはsjisになっている。
windowsのコマンドプロンプトからmysqlのコンソールにアクセスしているので、
上記クエリーを投げでもなぜかうまくいかない...

ここですごい人に見てもらって、どうもコマンドプロンプトのエンコードのせいかも
コマンドプロンプトのエンコードを変えるコマンドchcp(change code page)

>chcp
現在のコード ページ: 932
> chcp 65001
↑UTF8

とにかく、DOSのコマンドプロンプトで2バイドのものは書かないで
phpmyadminやnavicatなどSQLクライアントを使いましょう。

2012年9月18日火曜日

ついに僕もSSDデビュー

秋葉原からIntelSSD(120G)購入、8000円くらいでした。
セットアップに一苦労…
グラフィックカードが大きい過ぎで、唯一開いているSATAを完全隠した。
幸いファンのあたりだったので、無理やりグラボに穴を貫通してSSDのSATAケーブルを通した。
あとはマンターをつけて、固定しました。

物理繋いたら、あとはCドライブの移行です。
移行作業は割りと簡単、Intelの専用ソフトがあったので、ソース(既存Cドライブ)とターゲット(SSD)を選択して、「次へ」⇒再起動。そしてデータのコピーが終わったらシャットダウンして、SATAケーブルの差し替えを行う。

ここで説明書ではSWAPと書いてますが、実はここで差し替えたらドライブレターが乱れることがありますので、元CドライブのSATAケーブルをSSDに接続したら、一旦元CドライブHDDをOFFLINEにしたほうがいいです。
そしてWindowsを起動して、ちゃんとSSDがCドライブになっているを確認したら、再度PCをシャットダウンして、元CドライブのHDDもONLINEさせて、起動すると、ドライブレターがちゃんと変わります。

まぁメモメモ

PS:肝心なBOOTスピードは…まぁ驚く程のスピード感は感じ取れなかったが、実際いろいろ使ってみたら、確かに以前より3,4割早くなっている体感。まぁまぁ8000円だから、良かったと思う!