【问题标题】:Returning multiple columns and grouping by month返回多列并按月分组
【发布时间】:2010-07-07 09:48:06
【问题描述】:

我有三张表产品、销售额和成本。

sales 和 products 表各有一个小数类型的成本字段和一个日期类型的日期字段。

此外,sales 表还有一个 productname 字段,该字段与 products 表中的 productname 字段匹配。

products 表也有一个 category 字段。

我想选择每个月的所有销售和购买,并将它们显示在按月份分组的单独列中,直到今年。

类似下面的东西

            Sales  Purchases

January      100      50
Febuary      100      50
March        100      50
April        100      50
May          100      50
June         100      50
July          30      50

购买表与任何其他表都不相关。

但是,sales 表 productname 字段仅包含 products.productname 中存在的产品。

我想添加到我的查询的末尾

WHERE sales.productname=products.productname AND category='Food'

我不确定如何返回多个列,对每个月求和,然后按月分组。

我在这里问了类似的问题,并采取了一个解决方案,但它在一个列中同时返回了销售和购买。

如何将它们保存为单独的列?

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    有点类似于 Dave 的回答,但会同时显示几个月的销售和购买:

    SELECT theMonth, sum(Sales) as sumSales, sum(Purchases) as sumPurchases
    FROM
     ( SELECT date_format(theDate, "%Y-%m") AS theMonth, Cost as Sales, 0 AS Purchases
       FROM sales, products
       WHERE sales.productname=products.productname AND category='Food'
      UNION ALL
       SELECT date_format(theDate, "%Y-%m") AS theMonth, 0 as Sales, Cost as Purchases
       FROM purchases
     ) AS all_costs
    group by theMonth;
    

    (在 cmets 之后编辑)

    【讨论】:

    • 嗨,马克,非常感谢您的回答。我无法根据自己的需要进行更改(可能是因为我不理解它)。我的销售和采购表都有称为成本的字段,也没有称为销售或采购的字段。据我所知,您的解决方案是这样假设的?
    • 嗨,Jacob,假设它是您要报告为销售价值的销售表中的成本,以及您要报告为购买的采购表中的成本,请参阅编辑后的答案。
    • +1!对我来说看起来不错马克,虽然如果相同和购买表变得非常大(真的,真的,大!)会发生什么情况,你是从两者中选择所有数据,而不是在查询中按月分组......我认为这可以完成,但不太清楚如何。为几个月的左连接添加一个表到数据库结构会容易得多!
    • 嗨 Dave,您的查询从每个表中选择所有数据,按月汇总,然后按月连接它们,而我的查询从两个表中获取所有数据,合并它们然后汇总它们按月。我希望这两种情况下的性能相似,但我不是 MySQL 专家。我的查询考虑到 Jacob 无法轻松添加新表的事实;当然,添加新表还可以使查询返回没有销售或购买数据的月份。
    • 嗨,马克,我仍然收到成本不明确的错误...我应该改用 sales.cost 和 purchase.cost 吗?
    【解决方案2】:

    试试这个,或者类似的...

    选择 sal.theMonth、sal.sumSales、pur.sumPurchases 从 ( SELECT date_format(theDate, "%Y-%m") AS theMonth, sum(sales) A​​S sumSales FROM 销售表 按月分组 ) 作为萨尔 内部联接 ( SELECT date_format(theDate, "%Y-%m") AS theMonth, sum(purchases) A​​S sumPurchases FROM 购买表 按月分组 ) 纯正 ON sal.theMonth = pur.theMonth

    显然,您需要根据表定义调整表和字段名称...

    【讨论】:

    • 您可能还想查看我在stackoverflow.com/questions/3093924 上的回答,这将使您即使在表中没有任何数据的情况下也能获得几个月的结果。上面的答案假设您每个月在两个表中都有结果...
    • 嗯,我正要问这个。但是,我无法更轻松地创建更多表,或者至少我宁愿​​不这样做,因为我正在使用 CMS 类型的系统。只要销售或购买有数据,有没有办法显示任何月份的销售或购买?另外,也许是一个愚蠢的问题,但我是否将 WHERE 子句放在 GROUP BY 语句之前?
    • 是的,将任何过滤器放在子查询中,因为它会在将数据组合在一起之前限制数据。
    猜你喜欢
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2012-11-06
    • 1970-01-01
    • 2016-10-02
    • 2018-04-02
    相关资源
    最近更新 更多