查询以获取上周销售额最高的产品获得者

Posted

技术标签:

【中文标题】查询以获取上周销售额最高的产品获得者【英文标题】:Query to get top product gainers by sales over previous week 【发布时间】:2015-07-07 06:32:25 【问题描述】:

我有一个包含三列的数据库表。

WeekNumberProductNameSalesCount

样本数据如下表所示。我希望第 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 现在无法正常工作,出现一些错误。

以上是关于查询以获取上周销售额最高的产品获得者的主要内容,如果未能解决你的问题,请参考以下文章

PBI DAX 查询前 N 个以返回文本

如何找到使用 MapReduce 获得最高销售额的一周?

SQL Server - 我如何对上个月的产品进行排名?

获取每个月的产品总销售额,空白处为 0

每天获取产品销售额的平均值并计算销售额为正的天数

SQL Server 2008 R2-查询以获取按月销售的总销售额和数量