【问题标题】:grouping common results in sql在sql中对常见结果进行分组
【发布时间】:2011-03-12 16:49:40
【问题描述】:

我有一个产品表,其中包含字段产品、类别和成本,类型为 varchar、varchar 和小数。

然后我有一个销售表,其中包含字段 client、productname、quantity、cost 和 saledate,类型为 varchar、varchar、int、decimal 和 date。

我想显示一个月内销售的所有产品,比如当月。

但是,我不想单独显示每笔销售。我想自动将所有一种产品添加在一起并显示为一行。

在销售表中,每条销售记录的成本已经乘以数量。

因此,例如,如果购买了 5 杯啤酒,它将返回一行,显示名称为啤酒,数量为 5,价格为多少。

我需要这样说:

Select product, cost from sales, WHERE sales.product=products.name 
AND category='food' AND WHERE month(date_field) = month(getdate())

这应该显示当月某个类别产品的所有销售额,但是有没有简单的方法将产品“分组”在一起?

我必须考虑销售表中的数量字段,因为一次销售不一定只有一种产品

一个希望更清楚的例子,一个销售记录可能是一个客户的 2 瓶啤酒,成本为 10,另一个销售记录可能是另一个客户,数量为 3,成本为 15。我只想要一个记录会说啤酒,卖出了 5 个,总成本是 25。

到目前为止,我不知道从哪里开始......

【问题讨论】:

  • 问题可能比选择产品销售的查询更深入。可能是您的表结构可以改进。请您编辑您的问题,并为您的每个表格添加来自CREATE TABLE 的输出。您提到了一个 purchases 表,但它没有出现在您的查询中 - 这与其他两个表有什么关系?
  • 我在问题开始时描述了表结构?我已从我的问题中删除了购买表,因为它不相关。 - 我只是想防止问题不必要地冗长。
  • 从您的表描述和示例查询来看,您似乎已经通过 VARCHAR product 列关联了这些表。如果您更改products 表中product 的名称,除非您随后更新sales 表中的product_name,否则关系将中断。您可能实际上已经使用主键加入了表,但这在您的问题中并不清楚。我的观点是,如果您提供更多信息,您将帮助受访者提供更好的解决方案。

标签: sql mysql


【解决方案1】:

你正在寻找类似的东西

Select product, cost from sales,products WHERE sales.product=products.name 
AND category='food' AND month(date_field) = month(getdate())

根据产品表中的类别获取您建议的链接项目列表。

要按类别获取摘要,您需要以下内容:

Select category,SUM(Sales.Quantity),SUM(Sales.cost) from 
sales,products WHERE sales.product=products.name 
AND category='food' AND month(date_field) = month(getdate()) group by category

这可行,但您的数据库结构有很多需要批评的地方,特别是像您那样按名称链接产品不是很可靠。

【讨论】:

  • 嗨 Elemental,即使尝试了上面的解决方案,我也无法让它工作。我主要得到字段成本不明确的错误,并且 FUNCTION mytable.getdate 不存在。我认为我修正了歧义,但无法克服函数错误。
  • 确实 - 但是在您的示例中,有相关的 mysql 函数可以满足您在月份和 getdate 位置的需求。我建议您查阅有关日期的标量函数文档。
  • 我之前有 getdate 工作过,它似乎在您发布的查询中。我也无法克服模棱两可的错误,我应该使用 sales.cost from sales 和 products.cost from products 而不是仅仅 cost from sales, products 吗?
  • 稍微更改了解决方案以消除您的歧义,并将您在编辑问题中定义的成本包括在内
【解决方案2】:

这个问题看起来很眼熟……

答案是 SQL GROUP BY 语句。

SELECT product, SUM(quantity) FROM sales s, products p WHERE product=p.name AND category='food' AND month(date_field)=month(getdate()) GROUP BY product

上面的 SUM(数量)将计算给定月份特定产品的所有销售量。

【讨论】:

  • 我想我以前没有问过类似的问题,我的另一个问题是关于日期范围?
  • 在你的解决方案中,费用根本不退?是否可以按数量退还费用?
  • 只是注意到我刚刚从你那里得到一个关于这之前的步骤的问题。无意伤害。
  • 是的,您可以使用以下 SUM(quantity*cost) 退回成本
  • 没有受到伤害,只是担心我可能做错了什么。如果您没有看到,我更新了我的问题,但是销售成本已经乘以数量,所以我不想再乘以它......我举了一个希望更有意义的例子。
【解决方案3】:

使用GROUP BYCOUNT

【讨论】:

    【解决方案4】:
    SELECT productname, cost, COUNT(*) AS cnt
    FROM sales LEFT JOIN products ON sales.product = products.productname 
    WHERE category='food' AND month(date_field) = month(getdate())
    GROUP BY productname
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-27
      • 2013-07-10
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      相关资源
      最近更新 更多