2009-05-27 5 views
1

Je suis sûr que c'est un problème assez trivial, mais je ne suis pas sûr de ce que google pour trouver la solution.Utilisation des résultats des requêtes parentes dans la sélection imbriquée

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 total des sommes accumulées dans le compte à la fin du mois en tant que 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 la bonne façon d'aborder le problème? Ceci est principalement un exercice personnel (exécuté sur un très petit jeu de données) donc je ne suis pas très préoccupé par les performances, le SQL lisible est beaucoup plus important.

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

Répondre

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 

Vous avez écrit que vous ne Caté pas pour la performance, mais cette syntaxe est pas beaucoup plus complexe, mais sera plus efficace (juste 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 sera de compter SUM cumulatif aussi bien, mais il comptera chaque mois qu'une seule fois.

+0

I * think * Je comprends ce qui se passe ici, mais quel est ce premier champ "change"? – grapefrukt

+0

C'est votre SUM à partir de la sous-requête interne. Désolé, je n'ai pas remarqué que c'est une table, voir la mise à jour – Quassnoi

Questions connexes