ID、tDate、説明、キャッシュアウト、キャッシュインの列を持つ銀行取引のテーブルがあります。特に Amazon と Mazo というショップで、自分がどのようにお金を使っているかを知りたいので、次のような結果が必要です。
Month Amazon Mazo Total
1 100 200 300
私はこれを試みました:
SELECT
MONTH(tDate) AS Month,
SUM(IF(description LIKE '%amazon%',cashOut,0)) AS Amazon,
SUM(IF(description LIKE '%mazo%',cashOut,0)) AS Mazo,
SUM(cashOut) AS Total
FROM `transactions`
GROUP BY Month
ただし、次のことがわかりました。
Month Amazon Mazo Total
1 100 300 300
この SQL クエリの問題は、「Amazon」トランザクションも加算されるため、「mazo」トランザクションの合計が間違っていることです。
各トランザクションが上記の SUM の 1 つだけの一部になるように (PHP などに頼ることなく)、合計するトランザクションの選択を相互に排他的またはそのようなものにしたい。(私のテーブルにはこれよりもはるかに多くのデータが含まれており、多くの検索基準があるため、検索語として「% mazo %」を使用するだけでは十分ではありません。問題の一般的な解決策が必要です。)
誰か提案がありますか?
テーブルとそのデータの詳細:
CREATE TABLE `transactions` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`tDate` date NOT NULL,
`description` varchar(200) NOT NULL,
`cashOut` decimal(10,0) NOT NULL,
`cashIn` decimal(10,0) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB
INSERT INTO `transactions` (`id`, `tDate`, `description`, `cashOut`, `cashIn`) VALUES
(1, '2010-01-05', 'amazon', '100', '0'),
(4, '2010-01-15', 'mazo', '200', '0');