1

これはかなり些細な問題だと思いますが、解決策を見つけるために何をグーグルで検索すればよいかわかりません。

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

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の方がはるかに重要です。

MySQL5.0.45でInnoDBテーブルを実行しています

4

1 に答える 1

2
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`)

これも累積をSUMカウントしますが、毎月1回だけカウントされます。

于 2009-05-27T12:26:44.773 に答える