查询以获取上周销售额最高的产品获得者
Posted
技术标签:
【中文标题】查询以获取上周销售额最高的产品获得者【英文标题】:Query to get top product gainers by sales over previous week 【发布时间】:2015-07-07 06:32:25 【问题描述】:我有一个包含三列的数据库表。
WeekNumber
、ProductName
、SalesCount
样本数据如下表所示。我希望第 26 周(即第 25 周)在第 26 周的前 10 名收益者(按百分比)。唯一的条件是该产品在这两个周内的销售额都应大于 0。
在样本数据中B、C、D是常见产品,C的增益百分比最高。
同样,我也需要前 10 名输家。
到目前为止,我尝试的是在两周内进行内部连接并获得通用产品。但是,我无法获得最大赢家的逻辑。
输出应该是这样的
Product PercentGain
C 400%
D 12.5%
B 10%
【问题讨论】:
给我们表结构和你到目前为止所尝试的内容 您能否提供一个示例所需的输出(使用较小的数字,2,而不是 10) 请发布示例输出 @mohan111 我已经更新了问题。 @Amit,我已经更新了问题详情。 【参考方案1】:这将为您提供一个通用的答案,而不仅仅是针对任何特定的一周:
select top 10 product , gain [gain%]
from
(
SELECT product, ((curr.salescount-prev.salescount)/prev.salescount)*100 gain
from
(select weeknumber, product, salescount from tbl) prev
JOIN
(select weeknumber, product, salescount from tbl) curr
on prev.weeknumber = curr.weeknumber - 1
AND prev.product = curr.product
where prev.salescount > 0 and curr.salescount > 0
)A
order by gain desc
如果您对第 25 周和第 26 周感兴趣,只需在 WHERE
子句中添加以下条件:
and prev.weeknumber = 25
【讨论】:
这个查询的所有内容都是正确的,除了公式。我使用的是 ((curr.Sales - prev.Sales) *100)/prev.Sales,而不是 (curr.salescount-prev.salescount)/curr.salescount。感谢您的回答。【参考方案2】:如果您使用的是 SQL-Server 2012(或更新版本),您可以使用 lag
函数将“本周”的销售额与前一周的销售额相匹配。从那里开始,这只是一些数学:
SELECT TOP 10 product, sales/prev_sales - 1 AS gain
FROM (SELECT product,
sales,
LAG(sales) OVER (PARTITION BY product
ORDER BY weeknumber) AS prev_sales
FROM mytable) t
WHERE weeknumber = 26 AND
sales > 0 AND
prev_sales > 0 AND
sales > prev_sales
ORDER BY sales/prev_sales
【讨论】:
OP 没有说它是否是 SQL Server 2012+。你应该明确提到这个条款。 @Sourav_Agasti 由于 SQL-Server 2012 已经有好几年了,我只是假设 OP 不会使用任何旧版本。但你是对的,这需要说明。我已经用这个澄清编辑了我的答案。【参考方案3】:这是查询。
select top 10 product , gain [gain%]
from
(
SELECT curr.Product, ( (curr.Sales - prev.Sales ) *100)/prev.Sales gain
from
(select weeknumber, product, sales from ProductInfo where weeknumber = 25 ) prev
JOIN
(select weeknumber, product, sales from ProductInfo where weeknumber = 26 ) curr
on prev.product = curr.product
where prev.Sales > 0 and curr.Sales > 0
)A
order by gain desc
【讨论】:
很抱歉SQL fiddle
现在无法正常工作,出现一些错误。以上是关于查询以获取上周销售额最高的产品获得者的主要内容,如果未能解决你的问题,请参考以下文章