質問

私は、これは些細な問題であると確信しているが、私は解決策を見つけるためにGoogleにはよく分かりません。

私はこのようになりますテーブルを持っています:

CREATE TABLE IF NOT EXISTS `transactions` (
  `name` text collate utf8_swedish_ci NOT NULL,
  `value` decimal(65,2) NOT NULL,
  `date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci ROW_FORMAT=COMPACT;

私は私のインターネットバンキングサービスからデータをカット&ペーストすることで、これを取り込みます。 値は、どのような日付と名前の両方が含まれていることはかなり明白である必要があり、正または負の値にすることができ;) 私は私が毎月のための私の一番下の行を見てみましょうするクエリを構築しています:

SELECT sum(`value`) as 'change', DATE_FORMAT(`date`, '%M %Y') as 'month'
FROM `transactions` 
WHERE 1
GROUP BY year(`date`), month(`date`)

今、私は追加の列として月末に口座に合計累積金額を追加したいと思います。

SELECT sum(`value`) as 'change', DATE_FORMAT(`date`, '%M %Y') as 'month', 
(SELECT sum(`value`) FROM `transactions` WHERE `date` <= 123) as 'accumulated'
FROM `transactions` 
WHERE 1
GROUP BY year(`date`), month(`date`)
123私はそこに何をしたい正確ではありませんが、私はそのサブクエリ内の私のDATE_FORMATからの結果で取得する方法を理解していません。

この問題にアプローチするにも適切な方法ですか?

これは、主に個人的な運動(非常に小さなデータセット上で実行されている)であるので、私はパフォーマンスについて非常に心配していないよ、読み込み可能なSQLがはるかに重要です。

私は、MySQL 5.0.45でのInnoDBテーブルを実行しています。

役に立ちましたか?

解決

SELECT  change,
        CONCAT(mymonth, ' ', myyear) AS 'month',
        (
        SELECT  SUM(`value`)
        FROM    `transactions`
        WHERE   `date` < DATE_ADD(STR_TO_DATE(CONCAT('01.', mymonth, '.', myyear, '%D.%M.%Y'), INTERVAL 1 MONTH))
        )
FROM    (
        SELECT  sum(`value`) as 'change', YEAR(date) AS myyear, MONTH(date) AS mymonth
        FROM    `transactions` 
        WHERE 1
        GROUP BY 
                YEAR(`date`), MONTH(`date`)
        ) q

あなたは、パフォーマンスのためにケイトないことを書いたが、この構文ははるかに複雑ではなく、(念のため)、より効率的になります:

SELECT  SUM(value) AS change,
        CONCAT(MONTH(`date`), ' ', YEAR(`date`)) AS 'month',
        @r : = @r + SUM(value) AS cumulative
FROM    (
        SELECT  @r := 0
        ) AS vars,
        transactions
WHERE 1
GROUP BY 
        YEAR(`date`), MONTH(`date`)
ORDER BY
        YEAR(`date`), MONTH(`date`)

この1は、同様に累積SUMのをカウントしますが、それは一度だけ、毎月カウントされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top