読者です 読者をやめる 読者になる 読者になる

そもそもテーブル自体変更して・・・

SQL

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)
);

手元にMySQLPostgreSQLSQL 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;

追記:
かぶった - ぐるぐる〜