1

amount特定の月の列と前月の合計を合計したいと思います。現在、最初の月の合計は機能していますが、その後の毎月は少なくとも 2 桁高すぎます。

SELECT month, year, total, previous_month, previous_year, previous_total FROM (
  SELECT MONTH(p1.start_date) AS month,
    YEAR(p1.start_date) AS year,
    SUM(p1.amount) AS total,
    SUM(p2.amount) AS previous_total,
    MONTH(DATE_SUB(p1.start_date, INTERVAL 1 MONTH)) AS previous_month,
    YEAR(DATE_SUB(p1.start_date, INTERVAL 1 MONTH)) AS previous_year
  FROM trackings p1 
  LEFT JOIN trackings p2 ON EXTRACT(YEAR_MONTH FROM DATE_SUB(p1.start_date, INTERVAL 1 MONTH)) = EXTRACT(YEAR_MONTH FROM p2.start_date)
  GROUP BY EXTRACT(YEAR_MONTH FROM p1.start_date)
) AS p3;

関連する質問: 同じことをDATE_SUB3 回行っています。より効率的にするために日付関連の部分をクリーンアップする方法はありますか?

サンプル: http://sqlfiddle.com/#!2/3013a/1

4

1 に答える 1

2

問題は、結合で行が複数回カウントされていることだと考えてください。つまり、1 か月のすべての金額の合計がありますが、その月の各行は前月のすべての行と結合されています。

いくつかのサブセレクトを使用したソリューション:-

SELECT ThisMonth.MONTH, ThisMonth.YEAR, ThisMonth.TOTAL, PrevMonth.MONTH AS PREVIOUS_MONTH, PrevMonth.YEAR AS PREVIOUS_YEAR, PrevMonth.TOTAL AS PREVIOUS_TOTAL
FROM
(
    SELECT MONTH(start_date) AS `month`,
            YEAR(start_date) AS `year`,
            EXTRACT(YEAR_MONTH FROM start_date) AS YearMonth,
            SUM(amount) AS total
    FROM trackings
    GROUP BY `month`, `year`, YearMonth
) ThisMonth
LEFT OUTER JOIN
(
    SELECT MONTH(start_date) AS `month`,
            YEAR(start_date) AS `year`,
            EXTRACT(YEAR_MONTH FROM DATE_ADD(start_date, INTERVAL 1 MONTH)) AS YearMonth,
            SUM(amount) AS total
    FROM trackings
    GROUP BY `month`, `year`, YearMonth
) PrevMonth
ON ThisMonth.YearMonth = PrevMonth.YearMonth
于 2013-10-16T09:51:20.507 に答える