【问题标题】:MySQL summing totals by state by yearMySQL 按年份汇总各州的总数
【发布时间】:2015-09-24 11:30:26
【问题描述】:

我一直在玩这个似乎几个小时,但我无法得到我想要的结果。这是我遇到问题的查询:

    SELECT year.year, dstate,
   (SELECT sum(amount) FROM gift 
      WHERE year.year = gift.year 
      AND gift.donorno = donor.donorno)
    FROM donor, gift, year
      WHERE year.year = gift.year 
      AND gift.donorno = donor.donorno;

这似乎是多余的。无论如何,我正在尝试按年份显示每个州的总捐款(gift.amount)。

ex.
1999 GA 500 (donorno 1 from GA donated 200 and donorno 2 from GA donated 300)
1999 FL 400
2000 GA 600
2000 FL 500
...

为了澄清捐赠者可以来自同一州,但我试图合计该州在捐赠年份的捐赠金额。 任何建议表示赞赏。我觉得答案就在眼前。

这是一张表格供参考:

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    这是一个非常简单的连接和聚合问题。

    SELECT y.year, d.state, SUM(g.amount) AS total
    FROM gift AS g
    INNER JOIN year AS y ON y.year=g.year
    INNER JOIN donor AS d ON d.donorno=g.donorno
    GROUP BY y.year, d.state
    

    您不需要 SELECT 子句中的子查询来获取总金额。您可以通过分组来总结它。 (我认为GROUP BY 子句是您所缺少的。我建议您阅读它。)您所做的称为相关子查询,它在大型数据集上会非常慢,因为它有逐行计算,而不是作为集合操作。

    另外,请不要使用旧式逗号连接语法。而是使用如上所示的显式连接语法。它更清晰,有助于避免意外的笛卡尔积。

    【讨论】:

    • 谢谢。您可能会告诉我,我是 SQL 新手,目前正在学习入门课程。我不确定您所说的“旧式逗号语法”是什么意思。我还必须阅读如何使用 INNER JOIN 关键字。我的一些实验让我使用了 GROUP BY,但我不知道您可以将它与多个列一起使用。显然这是我的问题。我将不得不对此进行更多研究!
    • 可以通过在 FROM 子句中列出表并用逗号分隔它们,然后在 WHERE 子句中指定连接语法来完成连接。如果您忘记输入连接条件,您将获得笛卡尔积(每个表的每一行都将连接到其他表的每一行,因此您将获得(Table1 Rows) * (Table 2 Rows) * (Table 3 Rows)),这可能不是您想要的。通过使用显式 JOIN 语法,可以更轻松地查看您是否忘记了连接条件。了解 INNER、LEFT、RIGHT 和 CROSS 连接之间的区别是一项重要的技能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 2013-02-17
    • 2014-09-08
    • 2020-07-17
    相关资源
    最近更新 更多