【问题标题】:Using results from parent queries in nested select在嵌套选择中使用父查询的结果
【发布时间】:2009-05-27 12:18:16
【问题描述】:

我确定这是一个相当微不足道的问题,但我不确定要通过谷歌搜索什么来找到解决方案。

我有一张如下所示的表格:

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 更为重要。

我在 MySQL 5.0.45 上运行 InnoDB 表

【问题讨论】:

    标签: mysql innodb nested-queries


    【解决方案1】:
    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,但每个月只会计算一次。

    【讨论】:

    • 认为我明白这里发生了什么,但第一个“更改”字段是什么?
    • 这是来自内部子查询的 SUM。抱歉,我没有注意到它是一次表,请参阅帖子更新
    猜你喜欢
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多