在mysql中快速和慢速移动产品

时间:2014-08-24 09:45:10

标签: php mysql sql xampp

任何人都可以帮我解决MySQL上快速和慢速移动的产品吗?

我想知道如何SELECT CLAUSE所有快速移动的产品和缓慢移动的产品分开。这是我的表格。

**product**
productID
productname
price

**sales**
transactionID
productID
quantity
subtotal

**transaction**
transactionID
datetransact

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

FAST MOVING PRODUCTS是一种在特定时间段内经常销售的产品 SLOW MOVING PRODUCTS是一种不经常销售的产品,可以在很长一段时间内上架。

2 个答案:

答案 0 :(得分:2)

您需要按产品分组并选择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'

答案 1 :(得分:1)

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

要获得特定日期范围的答案,只需使用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;