Pergunta

Estou certo de que este é um problema bastante trivial, mas eu não tenho certeza do que para o Google para encontrar a solução.

Eu tenho uma tabela que se parece com isso:

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;

Eu preencher essa recortando e colando os dados do meu serviço de internet banking. O valor pode ser um negativo ou um valor positivo, o que tanto a data eo nome contêm deve ser bastante óbvio;) Eu construí uma consulta para deixe-me ver a minha linha de fundo para cada mês:

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

Agora eu gostaria de adicionar o dinheiro acumulado na conta no final do mês como uma coluna adicional.

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 não é exatamente o que eu quero lá, mas eu não entendo como começar com o resultado do meu DATE_FORMAT interior que subconsulta.

É isso mesmo a maneira correta de abordar o problema?

Este é principalmente um exercício pessoal (rodando em um pequeno conjunto de dados) para que eu não estou muito preocupado com o desempenho, SQL legível é muito mais importante.

Estou executando uma tabela InnoDB no MySQL 5.0.45

Foi útil?

Solução

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

Você escreveu que você não Cate para o desempenho, mas essa sintaxe não é muito mais complexa, mas será mais eficiente (apenas no caso):

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

Este vai contar SUM do acumulado, bem como, mas vai contar cada mês apenas uma vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top