任何人都可以帮我解决MySQL上快速和慢速移动的产品吗?
我想知道如何SELECT CLAUSE
所有快速移动的产品和缓慢移动的产品分开。这是我的表格。
**product**
productID
productname
price
**sales**
transactionID
productID
quantity
subtotal
**transaction**
transactionID
datetransact
我剪切了一些列以使其看起来很简单。
FAST MOVING PRODUCTS
是一种在特定时间段内经常销售的产品
SLOW MOVING PRODUCTS
是一种不经常销售的产品,可以在很长一段时间内上架。
答案 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;