【问题标题】:fast and slow moving products in mysqlmysql中快速和慢速移动的产品
【发布时间】:2014-10-17 16:32:15
【问题描述】:

谁能帮我了解一下 MySQL 上快速和慢速发展的产品?

我想知道如何分别SELECT CLAUSE所有快速移动的产品和慢速移动的产品。这是我的桌子。

**product**
productID
productname
price

**sales**
transactionID
productID
quantity
subtotal

**transaction**
transactionID
datetransact

我剪掉了一些列以使其看起来简单。

FAST MOVING PRODUCTS 是一种在特定时间段内经常销售的产品。
SLOW MOVING PRODUCTS 是一种销售频率不高且长期处于货架上的产品。

【问题讨论】:

  • 什么定义了“快速发展的产品”和“慢速发展的产品”?
  • 我编辑我的帖子解释一下,希望你能理解。
  • 所以您想根据特定日期交易范围内的交易频率来选择产品?
  • 根据 datetransact 范围内的销售频率对它们进行排名。是的先生!

标签: php mysql sql xampp


【解决方案1】:

您需要按产品分组并选择 min(datetransact) 和 max(datetransact)。这两者的差异将为您提供销售的产品数量以及第一次和最后一次销售日期之间的时间跨度。然后你可以将它们除以得到一个平均值。

已更新以计算销售数量。

select sum(sales.quantity) as productssold,
       min(transaction.datetransact) as firstsale,
       max(transaction.datetransact) as lastsale,
       max(transaction.datetransact) - min(transaction.datetransact) as timespan,
       sum(sales.quantity) / max(transaction.datetransact) - min(transaction.datetransact) as averagesold
from product
join sales on product.productid = sales.productid
join transaction on sales.transactionid = transaction.transactionid
group by product.productid
having averagesold >= 'desired value'

【讨论】:

  • 哇!正是我所需要的,它计算了在特定时间范围内销售了多少产品,它只需要像快和慢一样的升序和降序。谢谢先生!
  • 哦,等等,我怎样才能在首次销售和最后一次销售中设置所需的价值?例如。我想从上个月的 2014 年 7 月 24 日到今天的 2014 年 8 月 24 日选择畅销的产品?
  • 先生,productsold有问题,它只计算产品出现在销售表中,而不是产品实际销售的数量。 -_-
【解决方案2】:

就目前而言,斯科特的回答很好。首先,您似乎关心所售产品的数量,而不仅仅是包含该产品的交易数量。而且,这个问题(可能已经过修订)是关于特定日期范围的。

要获得特定日期范围的答案,只需使用where 子句或条件聚合。以下使用过滤包括没有销售的产品:

select p.*, sum(s.quantity) as productssold,
       sum(s.quantity) / datediff(@datelast, @datefirst)) as AvgPerDay
from product p left join
     sales s
     on p.productid = s.productid left join
     transaction t
     on s.transactionid = t.transactionid
where t.datetransact between @datefirst and @datelast
group by p.productid
order by AvgPerDay;

如果您不想要从未售出的产品,只需将 left join 更改回内部连接即可。

过滤方法的问题在于,某些产品可能在您的月经开始后进行了首次销售。要处理此问题,您需要测量自第一个销售日期(或者可能自product 表中的某个发布日期以来)的平均值。这基本上将日期条件从where 子句移动到having 子句:

select p.*, sum(case when t.datetransact between @datefirst and @datelast then s.quantity else 0 end
               ) as productssold,
       (sum(case when t.datetransact between @datefirst and @datelast then s.quantity else 0 end) /
        datediff(@datelast, least(@datefirst, max(t.datetransact)))
       ) as AvgPerDay
from product p left join
     sales s
     on p.productid = s.productid left join
     transaction t
     on s.transactionid = t.transactionid
group by p.productid
order by AvgPerDay;

【讨论】:

  • 哇,谢谢伙计,第一段代码可以用作滞销品。不能从 datefirst 和 datelast 开始销售的产品。你们太有帮助了,这也可以作为对其他人的有用参考。非常感谢!
  • 等等这里有问题。如果我运行上述条款,我的销售表已售出 5 种产品。它在 avgperday 返回一个空值,并且售出的商品返回 0。
  • @MharveenBiu 。 . .您是否定义了变量@datefirst@datelast?如果这种情况仍然存在,您能否在 SQL Fiddle 上设置一个示例。
  • 我不知道你在说什么在 mysql 查询中定义变量。我还不是高级用户。但如果你教我就好了。我要运行包含@datefirst 和@datelast 的sql 吗?
  • 输入@datefirst@datelast 的日期。
猜你喜欢
  • 1970-01-01
  • 2020-07-24
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多