そもそもテーブル自体変更して・・・
DBわからんちんなりにから、収入と支出のどちらかにしか入らないようなテーブルにしてしまえば?ということで、こんな感じで。
CREATE TABLE Cashes ( id INTEGER UNSIGNED AUTO_INCREMENT , date TIMESTAMP , summary TEXT NOT NULL , kind ENUM('INCOME', 'OUTGO') NOT NULL , amount INTEGER NOT NULL , note TEXT , PRIMARY KEY(id) );
手元にMySQLとPostgreSQLとSQL Serverしかないので、とりあえずMySQLで。
元の記事にある、3月の収支が知りたければ、
SELECT sum(CASE kind WHEN 'INCOME' THEN amount ELSE 0 END) as incomes , sum(CASE kind WHEN 'OUTGO' THEN amount ELSE 0 END) as outgoes , sum(CASE kind WHEN 'INCOME' THEN amount ELSE -amount END) as balance FROM Cashes WHERE year(date) = 2008 and month(date) = 3;
こう。WHEREでdateに対して関数使ってるから、インデックスはきかないけど、そもそも1テーブル構成だし、そんなにデータも増えんでしょ、ってことで割り切ってみる。
いや、ENUMつかうまでもなく、正負で判定すればいいな。
CREATE TABLE Cashes ( id INTEGER UNSIGNED AUTO_INCREMENT , date TIMESTAMP , summary TEXT NOT NULL , amount INTEGER NOT NULL , note TEXT , PRIMARY KEY(id) );
で、さっきのSELECTはこうなる。
SELECT sum(CASE WHEN amount > 0 THEN amount ELSE 0 END) as incomes , sum(CASE WHEN amount < 0 THEN -amount ELSE 0 END) as outgoes , sum(amount) as balance FROM Cashes WHERE year(date) = 2008 and month(date) = 3;
追記:
かぶった - ぐるぐる〜