Question

Je suis sûr que cela est un problème assez trivial, mais je ne suis pas sûr de ce que Google pour trouver la solution.

J'ai une table qui ressemble à ceci:

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;

Je POPULATE en coupant et coller des données de mon service bancaire Internet. La valeur peut être une valeur positive ou négative, ce qui à la fois la date et le nom contiennent devrait être assez évident;) Je l'ai construit une requête pour me laisser voir ma ligne de fond pour chaque mois:

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

Maintenant, je voudrais ajouter le montant total accumulé dans le compte à la fin du mois comme une colonne supplémentaire.

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 est pas exactement ce que je veux là-dedans, mais je ne comprends pas comment obtenir le résultat de mon DATE_FORMAT intérieur de cette sous-requête.

Est-ce même la bonne façon d'aborder le problème?

Ceci est la plupart du temps un exercice personnel (en cours d'exécution sur un ensemble de données très faible), donc je ne suis pas très préoccupé par la performance, lisible SQL est beaucoup plus important.

Je suis une table en cours d'exécution InnoDB MySQL 5.0.45

Était-ce utile?

La solution

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

Vous avez écrit que vous ne Caté pas pour la performance, mais cette syntaxe est pas beaucoup plus complexe, mais sera plus efficace (au cas où):

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

Celui-ci comptera SUM cumulatif est aussi bien, mais il comptera chaque mois qu'une seule fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top